`

(转)[Kotlin]Null Safety空安全

阅读更多

转自:http://blog.csdn.net/hp910315/article/details/50790681

 

Kotlin对比于Java的一个最大的区别就是它致力于消除空引用所带来的危险。在Java中,如果我们尝试访问一个空引用的成员可能就会导致空指针异常NullPointerException(NPE)的出现。在Kotlin语言中就解决了这个问题,下面来看看它是如何做到的。

在Kotlin中,类型系统将可空类型和不可空类型进行了区分,例如,String为不可空类型,String?为可空类型,如果将不可空类型赋值为null将会编译不通过。

var a: String = "abc"
a = null // compilation error

var b: String? = "abc"
b = null // ok

 

 对于不可空类型,可以直接调用它的成员变量或者函数,但是对应可空类型,直接调用成员变量或者函数将会编译不通过,相当于直接在语法层面解决做出了限制。

那么问题来了,因为可空类型调用成员变量或者函数会编译不通过,但是可空类型只是可以是空引用,也可以不是空引用,编译器直接全部进行了否则,假如一个可空类型它本身是不为空的,我们希望调用它的成员变量或者函数,但是编译却不通过,这貌似就不符合逻辑了。

例如:

var a: String? = "abc"
val l = a.length  //compilation error

 上面的代码按理说没什么问题,但是编译不通过,就是因为String为可控类型,编译器不让它直接调用成员变量或者函数,对于可能类型,如果希望调用它的成员变量或者函数就必须进行判断才行,否则编译器是不会通过的,这就是Kotlin解决空指针异常的方法之道,它会最大限度的要求程序员去避免空指针异常。

var b: String? = "abc"
val l = if (b != null) b.length else -1

 上面这个代码就没有问题,因为我们做了检查,所以编译器就允许调用可空引用b的的成员变量。

对于可空引用,如果我们希望调用它的成员变量或者函数就必须先做检查,否则编译器会报错。

例如:

if (b != null && b.length > 0)
  print("String of length ${b.length}")
else
  print("Empty string")

 对于这种限制,有好也有坏,给人的感觉有些死板,并且有些麻烦,使用非空引用,必须保证它非空,这个可以接受,使用可空引用,每次还有做检查,好麻烦,哈哈,语言的设计者当然不会这样难为人的,为了简单使用,可空引用有一种安全的调用方式,使用?.进行调用。

var b: String? = "abc"
b?.length  // ok

 这样就不需要你进行检查了,有人帮你做了,如果b为空引用,直接返回null,否则,就返回b.length。简单吧!

Kotlin语言的特定就是简洁,大家应该注意点,上面的语句都没有分号,这个在Java里面是绝对不可能的,但是在Kotlin里面,你就是这样这么任性。大家是否记得在Java中的三元运算符,在Kotlin里面也有类似的。

val l: Int = if (b != null) b.length else -1
//等价于
val l = b?.length ?: -1

 如果b为null返回-1,否则返回b.length。

可空引用的调用,下面还有第三种方面来调用它的成员函数和变量。

var b: String? = "abc"
val l = b!!.length()

 它的返回值有两种可能,如果b不为null,返回b.length(),否则,抛出一个空指针异常,如果b为null,你不想返回null,而是抛出一个空指针异常,你就可以使用它。

下面总结一下: 
1、Kotlin有两种类型:一个是非空引用类型,一个是可空引用类型。 
2、对于可空引用,如果希望调用它的成员变量或者成员函数,直接调用会出现编译错误,有三种方法可以调用: 
(1)在调用前,需要先检查,因为可能为null 
(2)使用b?.length的形式调用,如果b为null,返回null,否则返回b.length 
(3)使用b!!.length()的形式调用,如果b为null,抛出空指针异常,否则返回b.length

另外,我们知道类型转换可能产生ClassCastException异常,例如:

var a: Long = 1
val aInt: Int? = a as Int  // java.lang.ClassCastException

 那么如何避免这个异常呢?改成下面形式就可以了。

var a: Long = 1
val aInt: Int? = a as? Int

 上面这种方法就是安全类型转换,如果类型转换不成功,就会返回null,而不是抛出ClassCastException异常。

分享到:
评论

相关推荐

    Android-SwiftKotlin将Swift代码转换为Kotlin的工具非常简单快捷

    - Swift中的可选类型(Optional)在Kotlin中对应的是空安全(Null Safety),Kotlin中的变量默认是非空的,需显式声明为可为空。 2. **函数与方法**: - Swift的闭包和Kotlin的lambda表达式有相似之处,但Kotlin...

    Kotlin跨界秀:深入探索Kotlin/JS与Kotlin/Native的跨平台魔力

    4. **空安全**(Null Safety):Kotlin引入了空安全特性,帮助开发者避免空指针异常。 5. **扩展性**:Kotlin允许使用扩展函数和属性,为现有类添加新功能而不需要修改它们的源代码。 6. **协程**(Coroutines):...

    kotlin学习项目案例

    1. 空安全性(Null Safety):Kotlin 是空安全的语言,通过类型系统显式区分可为空(nullable)和不可为空(non-nullable)的引用。这样可以避免空指针异常(NullPointerException)。 2. 函数式编程(Functional ...

    kotlin文档

    - 空安全(Null Safety) - 异常(Exceptions) - 注解(Annotations) - 反射(Reflection) - 类型安全构建器(Type-Safe Builders) - 参考语法(Reference Grammar) - 语句符号(Notation Semicolons) - 语法...

    kotlin中文文档高清完整pdf

    Kotlin的特点包括空安全(Null Safety)、扩展函数(Extension Functions)、lambda表达式(Lambda Expressions)和类型推断(Type Inference)等。空安全可以极大地减少空指针异常的风险;扩展函数和lambda表达式则...

    kotlin-reference-chinese

    它支持变量声明(var 和 val),空安全(null-safety)以及表达式语法,比如函数调用和条件语句可以直接作为表达式。此外,它还引入了 lambda 表达式和匿名函数,使得代码更加简洁。 2. **类型系统**:Kotlin 是一...

    kotlin language document 全英文版.pdf

    Kotlin提供了许多特性,如空安全(null safety)、扩展函数(extension functions)、数据类(data classes)和智能转换(smart casts),这些都使得Android应用的开发更为高效和安全。 Kotlin语言的文档提到了关于...

    黑马kotlin高清视频教学2

    17.kotlin空值处理.mp4会介绍如何使用可空类型(nullable types)和非空断言(null safety)来避免空指针异常,确保代码的健壮性。 通过这10个视频,学习者将能够掌握Kotlin的基础语法和核心特性,为Android应用...

    探索Kotlin的密封类:封装可能性的强有力工具

    2. **安全性**:Kotlin通过空安全(Null Safety)和数据类(Data Classes)等特性,减少了常见的错误。 3. **互操作性**:Kotlin可以无缝地与现有的Java代码集成,并可调用Java库。 4. **扩展性**:Kotlin支持扩展...

    awesome-kotlin,科特林.zip

    6. **Inference and Null Safety**:类型推断让代码更简洁,而空安全机制则减少了NullPointerException的发生,提升了代码的稳定性。 7. **多平台开发**:Kotlin/Native支持跨平台开发,可以创建不依赖JVM的原生...

    kotlin 中文帮助 API 最新

    - **Inference 和 Null Safety**:Kotlin 的类型推断和非空类型系统提高了代码的可读性和安全性。 总之,"kotlin 中文帮助 API 最新" 是 Android 开发者的重要参考资料,它涵盖了 Kotlin 语言的核心特性、Android ...

    关于如何快速入手Kotlin

    - Kotlin的空安全(Null-Safety)特性可以避免常见的空指针异常。 4. **函数式编程**: - Kotlin支持函数式编程范式,包括高阶函数、Lambda表达式等。 5. **扩展性**: - Kotlin允许为现有类添加新的功能,而不...

    kotlin-plugin-1.4.10-release-Studio4.0-1.zip

    此外,Kotlin还强化了Null Safety,减少了空指针异常的发生,提高了代码的健壮性。 在Android Studio中,Kotlin插件扮演着至关重要的角色。1.4.10版本的插件优化了代码补全、重构和调试等功能,提升了开发效率。...

    Packt.Programming.Kotlin.2017

    1. **语法特性**:Kotlin的语法设计注重简洁性和可读性,例如,空安全性(null safety)避免了空指针异常,类型系统支持静态类型和隐式类型转换,还有表达式导向的编程风格。 2. **变量声明**:Kotlin有var(可变...

    kotlin docs v1.1

    - **空安全性**:深入讨论Kotlin中的空安全(null safety)机制,这是Kotlin的核心特性之一。 - **异常处理**:讲解Kotlin中的异常(exception)处理机制。 - **注解**:介绍注解(annotation)的定义和用途。 - **反射**...

    Kotlin语言教程和案例以及相关项目资源

    包括变量声明(var和val)、数据类型(如Int, Double, Boolean等)、空安全(null safety)和可空类型(?),以及表达式导向的编程风格。 2. **函数和lambda表达式**:Kotlin的函数定义简洁,支持高阶函数和匿名...

    kotlin-plugin-1.1.3-release-Studio3.0-1

    例如,它支持空安全(Null Safety),避免了常见的NullPointerException;其类型系统严谨,减少了类型转换的繁琐;还有数据类(Data Class)、扩展函数(Extension Function)以及高阶函数(Higher-Order Function)...

    Kotlin - Kotlin Language Documentation 2.0.0

    ##### Null Safety Handling null values safely is crucial in Kotlin: - **Nullable Types:** Mark a variable as nullable using `?`. - **Check for Null Values:** Use the `!!` operator to throw an ...

    Kotlin常见面试题.pdf

    请说明 Kotlin 的空安全(Null Safety)特性是什么,以及如何避免空指针异常。 Kotlin 的空安全特性是指它的类型系统能够确保非空类型变量永远不会被赋值为空。这意味着当一个变量被声明为非空类型时,如果试图...

    Kotlin-使用kotlin在安卓平台上开发的音乐App-移动移动开发.zip

    3. **Kotlin的Inference和Null-Safety**:深入理解类型推断和空安全机制,如何避免空指针异常。 4. **Android Jetpack**:研究整个Jetpack套件,包括导航、工作管理器、生命周期组件等。 5. **测试**:学习JUnit、...

Global site tag (gtag.js) - Google Analytics