Kotlin 基本语法---3.Kotlin 的空安全类型

上一篇:Kotlin 基本语法---2.Kotlin 的类与对象初步

Kotlin 基本语法主要包括以下内容:

下面要讲的是 Kotlin 的空安全类型;

三、Kotlin 的空安全类型

在 Java 中我们对空指针异常不怎么敏感,不注意就会出现这个异常,在 Kotlin 中针对空指针做出了防范;

下面是下面的主要内容:

  • 用 Kotlin 定义一个有返回值的方法
  • 用对象来接收有返回值的方法
  • 判断为 null 然后 return 在 Kotlin 中的写法
  • 总结

下面就来具体看一下, Kotlin 是如何避免空指针异常的;

我们在 Java 中定义一个有返回值的方法一般会这么写:

    private String A(){
        return null;
    }

可以看出,上面返回了 null ,稍微不注意便会出现空指针异常的错误;再看一些在 Kotlin 中的写法:

//不可返回null,避免空指针异常
fun B(): String {
    //不可返回null
    return "999"
}

在 Kotlin 中,我们是不能直接返回 null 的,否则会编译不通过;

1.用 Kotlin 定义一个可以返回 null 的方法

通过上面的代码,我们知道 Kotlin 是无法直接返回 null 的,否则会编译不通过;那我们需要返回 null 的时候怎么办呢?

1.1 用 Kotlin 定义一个有返回值的方法 --- 第一种方法

//不可返回null,避免空指针异常
fun B(): String {
    //不可直接返回null
    return null.toString()
}

可以看出,直接返回 null 编译不通过,但 Kotlin 中有个叫 null.toString() 的方法,这个方法将 null 转化为了字符串类型并返回;这样我们返回的不是 null 这个对象,而是返回的 "null "这个字符串,这样肯定不会报错;

1.2 用 Kotlin 定义一个有返回值的方法 --- 第二种方法

那么我们就想让它返回 null 这个对象该怎么办呢,看下面的写法:

//不可返回null,避免空指针异常,如果想返回可以为null的类型要加?
fun B(): String? {
    //不可直接返回null
    return null
}

我在 String 类型的后面加了一个 '?' 编译通过,这样就可以返回 null 对象; '?' 它的意思也就是可以为 null ;

返回 null 的方法总结:

  • 返回 null.toString() 
  • 定义类型时调用 :String?

1.3 用 Kotlin 定义一个无返回值的方法

这个就比较简单了,格式为:fun + 方法名:

fun setName(){
    println("123123")
}

 2.用对象来接收有返回值的方法

我们上面定义了一个方法 B() ,并返回了一个 null 对象(下面是根据1.2 后讲的),那么我们直接将方法 B() 中返回值拿出来,会不会报空指针异常呢?接下来我们定义一个对象 b 来接收方法 B() 的返回值并打印出来;

2.1 用对象来接收有返回值的方法 --- 第一种方法

让我们运行看一下,代码为:

fun main(args: Array<String>) {
    //直接定义了对象b,来接收方法B()返回的内容;并没有指定类型
    val b = B()
    println(b)
}

我们直接定义了对象b,来接收方法 B() 返回的内容,并没有为对象b指定类型;运行结果:

可以看出直接打印出来,并没有报错;

2.2 用对象来接收有返回值的方法 --- 第二种方法

上面我们定义了对象b 接收方法 B() 返回的内容,并没有为对象b指定类型,运行后并没有报错;但是我们为对象b指定类型后又是怎么样呢,将对象b指定为 String 类型;看下面的代码:

fun main(args: Array<String>) {
    //定义了对象b,指定类型为String类型,来接收方法B()返回的内容;
    val b: String? = B()
    println(b)
}
fun main(args: Array<String>) {
    //定义了对象b,调用toString()方法,来接收方法B()返回的内容;
    val b:String = B().toString()
    println(b)
}

可以看出,直接为对象b定义对象是编译不通过的, Kotlin 给出了两种方法,一种是指定对象b是一个可以为 null 的对象,另一种是方法 B() 调用 .toString() 方法;这两种方法都是可以的,打印结果和 2.1 相同并没有报错;

除了上面两种方法外,Kotlin 还提供了一种方法,如下面代码:

fun main(args: Array<String>) {
    val b:String = B()!!
    println(b)
}

在方法 B() 后面加了两个感叹号 "!!" ,这样编译也不会报错,意思是不用考虑后果,直接去运行;下面是运行结果:

可以看出除了异常,既然会报错,为什么还要提供这种方法呢,上面的这种方法主要是用于自己知道肯定不为 null ,才会去用它,不然也会报出空指针异常。

3.判断为 null 然后 return 在 Kotlin 中的写法

上面的标题表达的不清楚,看一下 Java 代码就清楚了:

        if (b == null) {
            //如果为 null 则不往下执行
            return;
        }

在 Java 中我们为了避免空指针异常,少不了加这样的判断,而上面三行的代码用 Kotlin 写又是什么样子呢:

    b ?: return

上面代码的意思是:如果b为 null 则返回;'?' 是可以为 null 的意思,' :'后面写的是要执行的代码;

4.总结

上面内容有点杂乱无章,所以总结了一下:

  •  Kotlin 定义一个无返回值的方法 
fun setName(){
    println("123123")
}
  • Kotlin 定义一个有返回值的方法
//不可返回null,避免空指针异常
fun B(): String {
    //不可直接返回null
    return null.toString()
}
//不可返回null,避免空指针异常,如果想返回可以为null的类型要加?
fun B(): String? {
    //不可直接返回null
    return null
}
  • Kotlin 定义一个对象来接收有返回值的方法
fun main(args: Array<String>) {
    //直接定义了对象b,来接收方法B()返回的内容;并没有指定类型
    val b = B()
    println(b)
}
fun main(args: Array<String>) {
    //定义了对象b,指定类型为String类型,来接收方法B()返回的内容;'?'可以为null 
    val b: String? = B()
    println(b)
}
fun main(args: Array<String>) {
    //定义了对象b,来接收方法B()返回的内容;调用toString()方法
    val b:String = B().toString()
    println(b)
}
fun main(args: Array<String>) {
    //小心使用,在确定方法B()不会返回null时,才能使用,不然会报错
    val b:String = B()!!
    println(b)
}
  • 判断为 null 然后 return 在 Kotlin 中的写法
    //如果b为 null 则返回;'?' 是可以为 null 的意思,' :'后面写的是要执行的代码;
    b ?: return

到这里就讲完了,下面是另一个例子,多加练习才能熟能生巧:

//定义一个无返回值的方法
fun setName() {
    println("123123")
}

//定义一个有返回值的方法 
//如果想返回可以为null的类型要加?
fun getName(): String? {
    //可返回null
    return null
}

fun main(args: Array<String>) {
    //获取到名字
    val name = getName()

    //1.如果name为null则返回null,否则返回长度
    println(name?.length)

    //2.定义一个可以为null的对象,但已经知道不为null;但是直接输出会报错。
    // 这时候要加两个 !! 表示我已经知道这个对象不为null,可以直接输出/操作
    val value: String? = "你好啊"
    println(value!!.length)

    //3.如果name为空执行setName()
    if (name != null) {
        return
    } else {
        setName()
    }

    //4.如果name为空返回不再执行
    name ?: return
}

上一篇:Kotlin 基本语法---2.Kotlin 的类与对象初步

下一篇:Kotlin 基本语法---4.Kotlin 的智能转换

猜你喜欢

转载自blog.csdn.net/wuqingsen1/article/details/83009383