简书链接:kotlin可空和不可空理解
文章字数:379,阅读全文大约需要1分钟
下面方法中,如果有分支返回了null,就必须在返回值后面加上?,

1
2
3
fun testStr(ints:Int): String ?{
return if (ints>0) "you are right" else null;
}

那么访问返回值时候呢 又应该如何操作?

1
2
3
4
5
6
  var str=testStr(0);
var length = str?.length;//这句话的意思是如果不为空就访问长度 为空就返回null给length
println("str length${length}");
var length1 = str!!.length
//如果传递的是小于0, 那么抛出空指针 因为你强制访问了他的长度了 但是,如果不加上访问length1的代依然不会空指针,哈哈,没有使用的的东西它不会马上报错
println("str length${length1}");

null不仅仅存在于String函数,这样的也可以

1
2
3
fun test(ints:Int): Int ?{
return if (ints>0) 1 else null;
}

我之前学过一些swift,不过已经很久没用了,没有买iphone手机,感觉学了也白学,终究会遗忘,但是感觉好像和swift差不多,另外肯定是idea的开发工具更牛逼一些,

其他举例

1
2
3
4
5
6
7
8
9
10
11

var email=null;

email?: println("email is empty");

email?.let{
println("emali not empty");
}

var current= email?.let { "nihao" }?:"not i fuck i am null";
println("current var ${current}");

顾名思义,上面的代码已经说了是啥子情况。
如果email为空,则分别打印email is empty ,current var not i fuck i am null”

绕过空检查

1
2
3
4
5
6
7
8
9
10
11
class MyTest {
lateinit var subject: String


fun test() {
println("tes str :${subject}");
}

}

MyTest().test();

上面的代码如果不加上lateinit 是会报错的,必须进行初始化,或者在构造进行初始化。或者加上?号,
但是懒加载的话你自己保证。 上面的代码虽然是报错的,但是可以自己实现具体初始化逻辑。