上一篇:Kotlin 基本语法---2.Kotlin 的类与对象初步
Kotlin 基本语法主要包括以下内容:
- Kotlin 的基本类型
- Kotlin 的类与对象初步
- Kotlin 的空安全类型
- 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
}