详解芬兰湾的科特林的空指针处理

  

<强>详解芬兰湾的科特林的空指针处理

  

芬兰湾的科特林的空指针处理相比于java有着极大的提高,可以说是不用担心出现NullPointerException的错误,芬兰湾的科特林对于对象为零的情况有严格的界定,编码的阶段就需要用代码表明引用是否可以为空,为空的情况需要强制性的判断处理。

  

咋看一下这些在java里面其实也有,问题是一般开发中不写也是可以的(大部分开发不会花很多时间考虑这些),等出了空指针错误再一个个打补丁。这样往往会遗漏很多空指针,后期的解决仅仅是做一个如果判断,没有从根源解决问题

  

<强>变量需要知道是否可以零为

  

第一个与java的不同,芬兰湾的科特林声明引用时不可以直接赋值为空

        var helloA:字符串=null//编译器直接报零不能错一个非零值类型字符串      

<强>这里插一句,芬兰湾的科特林的成员变量(全局变量)必须要初始化甚至是基本数据类型都要手动给一个初始值,局部变量可以不用初始化,上面的例子是成员变量的声明。

  

编译器直接表示你好是一个非空类型你不可以直接赋一个null值。对于我们java原住民来说声明变量时如果不去赋值,编译器会默认赋零(除去基本数据类型),在芬兰湾的科特林这是不允许的。

  

<强>类型& # 63;

  

当某个变量的值可以为零的时候,必须在声明处的类型后添加& # 63;来标识该引用可为空。
  

  

这是官方文档的说明,也就是说上面的变量声明只需要在字符串类型后面加一个& # 63;就可以解决这个错误。

        var helloB:字符串# 63;=null      

如果不用?也可以直接初始化来解决问题

        var helloA:字符串="你好"      

<强>字符串和字符串?

  

helloA和helloB2个变量的类型分别为字符串和字符串?,这2种类型的区别在于引用时是否空安全,字符串?代表可能为空,引用不安全,字符串代表不会为空,引用安全。比如调用一下helloB的方法

  

详解芬兰湾的科特林的空指针处理”> <br/>
  </p>
  <p>可以看到有些方法是灰的代表不能直接调用,有些是白的代表可以直接调用,为什么可以直接调用后面再讲</p>
  <p> helloB。//长度只有安全(& # 63;。)或非空断言(! !)允许调用>
  helloB& # 63; . length </pre>
  
  <p> <强>注意这里的返回值类型为int # 63;依然是可以为空的类型</强> </p>
  <p>不推荐的写法! !这个操作符可以说是为了空指针错误爱好者准备的,使用了! !操作符代表你不关心变量的空判断可以报出NullPointerException,又或者你有绝对的自信这里肯定不为空,可以放心的调用,可以说! !放弃了判空的检查</p>
  
  <pre类=   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

详解芬兰湾的科特林的空指针处理