首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类型声明与空安全(Void Safety)

在 Kotlin 中,不可能为空的变量和可能为空的变量被强行分开了(Java 有 @Nullable 和 @NonNull 注释,但只会提供警告)。那 Kotlin 为什么要这样设计呢?...Kotlin 非空类型/可空类型(NonNull/Nullable)声明 最开始时我们提到:在 Kotlin 中,不可能为空的变量和可能为空的变量被强行分开了。具体是怎么分开的呢?...Kotlin 可空(Nullable)类型的调用 声明一个非空变量,意味着你可以随意的调用他的方法而不用担心空指针错误,相对应的,可空变量则无法保证了。...Kotlin 通过不允许可空变量直接调用方法来保证不会出现空指针错误。那么可空变量应该怎么调用呢? Kotlin 可空变量的调用方法是:调用的”.”号前加”?”或”!!”。...所以,可空是具有传递性的。 双叹号由于在变量为空时会抛出异常,所以它的返回值就还是为 Int,因为抛了异常的话,后面的代码已经不会被执行了。

1K50

在 Android 11 及更高版本系统中处理可空性

这里就不得不提 Kotlin 在可空性方面的优势了。Kotlin 将可空性直接融合到了类型系统中,这意味着开发者在声明一个参数时,需要提前说明该参数能否接纳 null 值。...= 1 y = null // okay Kotlin 的这个特性能够让您的代码更安全。即使您随后调用一个方法或试图访问 x 等非空变量属性,也不会面临空指针异常的风险。...不用担心,Kotlin 编译器能够识别 Java 代码的注释,从而判定方法返回的结果是否为可空值,例如: JAVA public @Nullable String getCurrentName() {...@NonNull 注释则恰好与之相反,如果一个方法标有 @NonNull 注释,Kotlin 编译器会将该方法返回的结果视为非空类型,并禁止您在之后的代码中把该结果设置为 null。...您可以通过在代码中添加空值检查来解决这些警告或报错。

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin与Java互操作

    Java中的任何引用都可能是null,这使得Kotlin对来自Java的对象进行严格的空安全检查是不现实的。Java声明的类型在Kotlin中称为平台类型,并会被特别对待。...当把一个平台值赋给一个Kotlin变量时,可以依赖类型推断(该变量会具有所推断出的平台类型,如上例中item所具有的类型),或者选择我们所期望的类型(可空的或非空类型均可)。...=item//允许,没有问题 Val notNull:String=item//允许,运行时可能失败 如果选择非空类型,编译器会在赋值时触发一个断言,这样可以防止Kotlin的非空变量保存空值。...; JSR-305 支持 在JSR-305中,定义的 @Nonnull 注解来表示 Java 类型的可空性。...如果对这些函数使用@JvmStatic进行标注,那么Kotlin还可以为在命名对象或伴生对象中定义的函数生成静态方法。

    3.5K30

    程序里怎么表达“没有”

    用"--"表示没有数据 在业务开发中,不管用什么开发语言,一般都会用空来表示“没有”,比如Java中的null,MySQL中的NULL,js中的null和undefined,Python中的None等等...比较有代表性的有"oneof"法和“Wrapper”法。具体细节的讨论可以见这里。 但是null的确存在问题(特别是在静态语言开发者的眼中),它会让类型系统的消除程序错误的功能失效。...但,编译器却允许: char * p = 0; 因为0在C++里表示空指针,所以编译器做了特殊处理,视作合法。直到运行时触发了segment fault。...如果细细反思Optional这个方案就能发现Optional并非是问题的关键,而真正的关键是: 用一个最简单的办法来表达“没有”,这个表达容易在前中后端形成约定,就连初学者都很容易明白和使用; 想办法“...但kotlin中的null不能随便用。kotlin要求开发人员要自己控制一个变量的类型是nullable还是非nuallable的。

    1.8K31

    减少崩溃,提升体验 | 使用 Kotlin 打造优质应用

    比如 Kotlin 的空安全性就让点评的 Android 应用团队赞不绝口,而且团队开发者还可以通过在 Java 代码中使用 @Nullable 和 @NonNull 等注解来确保 Kotlin 代码获得正确的可空性推断...为了避免 NullPointerException,您需要确保正在处理的对象引用非 null,然后再调用方法或尝试访问其成员。在 Kotlin 中,是否可为 null 是类型系统的一部分。...在 Java 编程语言中,对于原语,您始终会使用 ==,因此,一个常见的错误是为对象也调用 == (引用相等),而实际上您想检查它们是否在结构上相等 (通过调用 equals() 检查)。...在 Kotlin 中,如果您使用 when 作为表达式,就可以依靠编译器来处理: 如果您没有覆盖所有可能的分支,会出现一个编译器错误。 结论 应用稳定性对用户和品牌至关重要。...立即使用 Kotlin,降低崩溃率,提高用户满意度,并保持较高的应用评分让您的用户留存和获取始终处于领先地位。

    1.4K10

    Android开发必备知识:为什么说Kotlin值得一试

    反正我是受够了。 3.2 空安全与属性代理 第一次见到空类型安全的设计是在 Swift 当中,那时候还觉得这个东西有点儿意思哈,一旦要求变量不能为空以后,因它而导致的空指针异常的可能性就直接没有了。...想想每次 QA 提的 bug 吧,说少了都得有三分之一是空指针吧。 Kotlin 的空安全设计,主要是在类型后面加?表示可空,否则就不能为 null。...这表示编译器不再强制 savedInstanceState 是否可 null,开发者在覆写时可以自己决定是否可 null。...因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...这样返回的 StringBuilder 对象实际上是包 "whatever" 这个字符串的。 至于说 Kotlin 对于 RxJava 的友好性,使得我突然有点儿相信缘分这种东西了: ?

    1.2K90

    hello Kotlin

    反正我是受够了。 3.2 空安全与属性代理 第一次见到空类型安全的设计是在 Swift 当中,那时候还觉得这个东西有点儿意思哈,一旦要求变量不能为空以后,因它而导致的空指针异常的可能性就直接没有了。...想想每次 QA 提的 bug 吧,说少了都得有三分之一是空指针吧。 Kotlin 的空安全设计,主要是在类型后面加?表示可空,否则就不能为 null。...这表示编译器不再强制 savedInstanceState 是否可 null,开发者在覆写时可以自己决定是否可 null。...因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...为了让大家印象深刻,我下面给出类似功能的 Java 的代码实现: ? 而你如果说希望在 Java 中也希望像下面这样拿到这个泛型参数的类型,是不可以的: ?

    93050

    使用视图绑定替代 findViewById

    在 Activity 的 onCreate 方法中,要将 root 传入 setContentView 方法,从而让 Activity 可以使用绑定对象中的布局。...如果您正在使用 Kotlin,视图绑定的生成类也已经对互操作进行了优化。通过 @Nullable 和 @NonNull 注解的使用,Kolin 可以正确的将属性暴露为空安全类型。...既然编译器可以通过 XML 布局文件知道每个属性的类型和为空的可能性,那他就可以安全的调用 findViewById。...△ 视图绑定空安全、只引用当前布局中的视图、支持 Java 和 Kotlin,同时也更简洁 上图为对比视图绑定、ButterKnife 和 Kotlin 合成方法的功能。...虽然 ButterKnife 会在运行时校验可空与不可空,但是编译器并不会检查您匹配的视图是否在存在于您的布局之中。 为了安全性与更简洁代码,我们推荐尝试使用视图绑定。

    1.6K30

    OC - 属性关键字和所有权修饰符

    这些关键字可以用于属性、方法返回值和参数中,来指定对象的可空性,这样编写代码的时候就会智能提示。在 Swift 中可以使用!和?...属性关键字 用法 nullable、_Nullable 、__nullable 对象可以为空,区别在于放置位置不同 nonnull、_Nonnull、__nonnull 对象不能为空,区别在于放置位置不同...方法不能返回为空,setter 方法可以为空;2.必须重写 setter 或 getter 方法做非空处理。...为了安全起见,苹果还制定了以下几条规则: typedef类型的的可空性通常依赖于上下文,即使在 Audited Regions 中也不能假定它为nonnull; 对于复杂的指针类型(如id *)必须明确指定它的可空性...2.编译器将为 weak 修饰的属性生成带 __weak 所有权修饰符的实例变量。

    1.4K31

    java空指针报错_空指针异常是什么意思

    大家好,又见面了,我是你们的朋友全栈君。 Java 中任何对象都有可能为空,当我们调用空对象的方法时就会抛出 NullPointerException 空指针异常,这是一种非常常见的错误类型。...: Checker Framework 与 @NonNull、@Nullable Checker Framework 能够作为 javac 编译器的插件运行,对代码中的数据类型进行检测,预防各类问题。...一方面我们无需再引入额外的 Jar 包,更重要的是 Spring Framework 代码本身就使用了这些注解,这样我们在调用它的 API 时就能有效地处理空值了。...使用了另一种方式,用户在定义变量时就需要明确区分 可空和不可空类型。...length // 强制忽略,可能引发空值异常 Kotlin 的特性之一是与 Java 的可互操作性,但 Kotlin 编译器无法知晓 Java 类型是否为空,这就需要在 Java 代码中使用注解了,而

    2.2K30

    数据类增加nonNull字段反序列化的坑

    所以你就知道了,Kotlin 里面的字段在这种鬼畜的写法下面也会被突破限制,空类型安全似乎也很无力。...柳暗花明,noArg 的妙用 我们再来理一下,我们的目标其实是要做到: company 字段定义为 nonNull 类型 在反序列化 Json 时,如果 Json 中没有这个字段,要赋值为空字符串,也就是要有个默认值...在父类中定义为抽象的;父类当中一定要在 init 中赋值。...不知道大家有没有听说过这个梗,有人反映说为啥 Kotlin 对于 nullable 的字段这么苛刻,每次都写 ?....感觉很丑啊;官方的人回复说,它就是很丑啊,就是要丑到让你难受然后去用 nonNull 的类型进而避免问题的产生嘛。从这个意义上来讲,设计本身是丑的,写出丑的代码就是理所当然的,警示作用。 5.

    93910

    Kotlin京东业务实战 | 强大又简洁的JVM语言

    Kotlin已经越走越近,抱着“为了让移动开发更简单”的理念,让Kotlin在京东业务中落地。 >>>> Kotlin简介 Kotlin是一门运行在JVM之上的语言,由Jetbrains创建。...在Kotlin中,编译器是可以识别你的引用是否是null,进而提醒你。默认kotlin中所有的对象都是不为Null的。...Android Studio提供将Java转为Kotlin的插件,可以转换大部分代码。 常见编译问题: a、代码编译出错,定义变量时,没有赋初始值,变量可以为空,需要加?...= null b、代码编译出错,变量可以为空时,使用变量需要加?...text = entity.minOrderAmount c、代码编译出错,由于FontsUtil的参数有@NonNull标签,需要保证只有在确保变量不是null的情况下才能这么调用,否则它会抛出异常

    1.7K00

    号称取代 Java 的 Kotlin 语言到底是什么鬼?

    我从个人角度赞成 IDEA 的做法因为我想不到有哪些应用场景需要遮蔽方法参数。 类型推断 在Kotlin中,当你声明一个var或是val,你通常会让编译器从右边的表达式类型中猜测变量类型。...如今,Optional 是在 API 边界处理返回类型中的空值的非常流行的方式。 Kotlin 中没有 Optional 的等价物,所以你大概应该使用 Kotlin 的可空类型。...不幸的是,Kotlin 的 let 不会那样工作。它从左侧的所有内容中调用,包括空值。...该语言背后的团队曾多次声明,他们最初试图使 Java 可为空的每种类型,但他们发现它实际上让代码变得更糟糕。...也许可以添加一个编译器标志,使每种 Java 类型都可以为空,但这对 Kotlin 团队来说不得不花费大量额外资源。

    2.3K50

    Kotlin入门(8)空值的判断与处理

    然而,饶是有经验的开发者,尚且摆脱不了如影随形的空指针,何况编程新手呢?问题的症结在于,Java编译器不会检查空值,只能由开发者在代码中增加“if (*** !...注意到上面的方法有区分非空串与可空串,这是缘于Kotlin引入了空安全的概念,每个类型的对象都分作不可为null和可以为null两种。...前面的文章中,正常声明的对象默认都是非空(不可为null),比如下面这个声明字符串变量的代码 var strNotNull:String = "" 非空对象要么在声明时就赋值,要么在方法调用前赋值...至于可以为空的对象,可于声明之时在类型后面加个问号,如同上一篇文章声明可空字符串数组的代码“val poem2Array:Array的操作符说明概括如下: 1、声明对象实例时,在类型名称后面加问号,表示该对象可以为空; 2、调用对象方法时,在实例名称后面加问号,表示一旦实例为空就返回null; 3、新引入运算符“?

    4.4K10

    变量声明和变量状态设计

    Java 提供了 @NonNull 和 @Nullable 注解来满足对象状态的空设计。...因为在 Java 很多释放操作都会将引用的变量设置为空,这是个很常见的防止内存泄漏的办法。但代价是将程序状态复杂化。我们确实应该慎重考虑一个变量是否可以一直被持有,但大部分情况我们是可以不用担心的。...2 的话,设想一下,如果是可空类型,也没必要用 lateinit 了,直接初始化为 null 即可。所以 2 也是合理的。...以后不再为空即是他和可空变量的区别,从状态复杂度来看,lateinit 变量是介于非空变量和可空变量之间的。 使用 lateinit 是一个有风险的事情,因为非空的条件变复杂了(初始化后才是非空)。...可参考:https://en.wikipedia.org/wiki/Null_object_pattern 4. final 除了 Kotlin 的非空类型/可空类型,val/var(即 Java 的

    1.7K30

    前沿 | 为什么我要改用Kotlin

    希望能及时让大家了解一下Kotlin。 相信很多开发人员,尤其是Android开发者都会或多或少听说过Kotlin,当然如果没有听过或者不熟悉也没有关系。...,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。...对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。...当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。 关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。...这个时间和体验对应编程中的,我想应该是高效率和高可读性,可维护性的代码。 现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。

    66410

    介绍Kotlin第二部分(翻译篇)

    有关Kotlin的collection扩展功能的更多信息可以在官方网站API doc中找到 2、Null safety(空安全) 当涉及到可空性,Kotlin编译器会非常严格的剖析您的代码。...= null val notNil: String = "Hi" var nil = null 这三个变量声明有两个可空值,一个不为null。无效性的共同点是问号;可空变量和函数参数用问号定义。...这个问号在Kotlin的null safe起着重要的作用。如果Kotlin编译器在变量声明或函数参数/返回类型中看到这个问号,它将强制您对空检查。...如果您主要编写的是Kotlin代码,那您将会从NullPointException解放出来。然而Kotlin与Java高度互操作,当你传入的数据可能为空时。Kotlin会让你处理这个十亿美元的错误。...在Kotlin中类型推断是非常好的,编译器在编写代码时给出了很多有用的提示。当您需要检查对象是否是某种类型时,您可以使用is关键字。

    98940

    Null Reference: 避免和解决空引用错误

    空引用(Null Reference)错误是编程中常见的问题之一,会导致程序崩溃和异常行为。在这篇文章中,我将深入探讨空引用错误的原因、检测方法和解决策略,帮助大家编写更健壮的代码。...例如,在Java中: String str = null; System.out.println(str.length()); // 空引用错误 1.2 空引用的影响 空引用错误会导致: 程序崩溃 数据不一致...(Java) 使用非空注解提示编译器和开发者: import javax.annotation.Nonnull; public void printLength(@Nonnull String str...例如,Kotlin中的 null 安全特性: fun main() { var str: String? = null println(str?....表格总结 技术 描述 示例代码 初始化变量 在声明时初始化变量 private String str = ""; 空检查 在访问对象前进行空检查 if (str !

    16510

    Better Kotlin

    这意味着你不允许明确声明为 val,它就不能保证它是不可变的。 对于普通变量来说,「不可变」和「只读」之间并没什么区别,因为你没办法复写一个 val 变量,所以在此时却是是不可变的。...核心意思是:Kotlin 使用 object 代替 Java 匿名内部类实现。 很明显,即便如此,这里的访问应该也是合情合理的。从匿名内部类中访问成员变量在 Java 语言中是完全允许的。...代表它们可以为空,然后为它们赋值为 null。实际上,我们在使用中一点都不希望它们为空。这样造成的后果就是,我们每次要使用它的时候都必须去先判断它不为空。这样无用的代码,无疑是浪费了我们的工作时间。...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是有了下面的代码。...仔细一看,发现 Java 编写这个接口的时候,会被认为这个参数 "data" 对应的 "value" 是可以为 null 的,而改为 Kotlin 后,由于 Kotlin 默认不为空的机制,所以需要的参数是一个不可以为

    1.3K20
    领券