<强>详解芬兰湾的科特林的空指针处理强>
芬兰湾的科特林的空指针处理相比于java有着极大的提高,可以说是不用担心出现NullPointerException的错误,芬兰湾的科特林对于对象为零的情况有严格的界定,编码的阶段就需要用代码表明引用是否可以为空,为空的情况需要强制性的判断处理。
咋看一下这些在java里面其实也有,问题是一般开发中不写也是可以的(大部分开发不会花很多时间考虑这些),等出了空指针错误再一个个打补丁。这样往往会遗漏很多空指针,后期的解决仅仅是做一个如果判断,没有从根源解决问题
<强>变量需要知道是否可以零为强>
第一个与java的不同,芬兰湾的科特林声明引用时不可以直接赋值为空
var helloA:字符串=null//编译器直接报零不能错一个非零值类型字符串
<强>这里插一句,芬兰湾的科特林的成员变量(全局变量)必须要初始化甚至是基本数据类型都要手动给一个初始值,局部变量可以不用初始化,上面的例子是成员变量的声明。强>
编译器直接表示你好是一个非空类型你不可以直接赋一个null值。对于我们java原住民来说声明变量时如果不去赋值,编译器会默认赋零(除去基本数据类型),在芬兰湾的科特林这是不允许的。
<强>类型& # 63;强>
当某个变量的值可以为零的时候,必须在声明处的类型后添加& # 63;来标识该引用可为空。
这是官方文档的说明,也就是说上面的变量声明只需要在字符串类型后面加一个& # 63;就可以解决这个错误。
var helloB:字符串# 63;=null
如果不用?也可以直接初始化来解决问题
var helloA:字符串="你好"
<强>字符串和字符串? 强>
helloA和helloB2个变量的类型分别为字符串和字符串?,这2种类型的区别在于引用时是否空安全,字符串?代表可能为空,引用不安全,字符串代表不会为空,引用安全。比如调用一下helloB的方法
helloB ! ! . length
<强>猫王操作符& # 63;:强>
回到& # 63;。的调用上来,这个调用方式存在一个让人不安的处理,就是在变量为零的情况下,会直接返回零,这样空指针的隐患还在。
var l: Int=helloB& # 63;。//长度报错类型不匹配int # 63;和Int
修正的话需要通过如果判断来进行判空处理
var l: Int=如果(helloB& # 63;。helloB长度!=null)。其他长度1
这种写法可以简化成猫王操作符& # 63;:
var le: Int=helloB& # 63;。& # 63;长度:0
当& # 63;:左边非空返回左边的值,左边为空则返回右边的值
最后前文提到的当helloB为空时有些方法仍然可以调用比如=方法
helloB.equals (helloA)
即使helloB为可空类型依然可以调用=方法,但是这里的=方法并不是String.java平等的方法,而是StringJvm.kt中平等的方法
公共娱乐字符串# 63;。equals(其他:字符串# 63;ignoreCase:布尔=false):布尔{ 如果(这===null) 返回其他===null 返回如果(ignoreCase !) (以).equals(其他) 其他的 (以).equalsIgnoreCase(其他) } >之前<>强关键代码强>
===null 返回其他===null详解芬兰湾的科特林的空指针处理