<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ### Any? 可空類型(Nullable Types) [TOC] 可空類型是Kotlin類型系統的一個特性,主要是為了解決Java中的令人頭疼的 NullPointerException問題。 我們知道,在Java中如果一個變量可以是 null ,來那么使用它調用一個方法就是不安全的,因為它會導致: NullPointerException(NPE) 。 **Kotlin把可空性(nullability)作為類型系統的一部分,Kotlin編譯器可以直接在編譯過程中發現許多可能的錯誤,并減少在運行時拋出異常的可能性。** Kotlin的類型系統和Java相比,**首要的區別就是Kotlin對可空類型的顯式支持**。 #### **null 是什么** 在Java中, null 是任何引用類型的默認值,不嚴格的說是所有Object類型的默認值。 **這里的 null 既不是對象也不是一種類型,它僅是一種特殊的值,我們可以將其賦予任何引用類型,也可以將 null 轉化成任何類型**。在編譯和運行時期,將 null 強制轉換成任何引用類型都是可行的,在運行時期都不會拋出空指針異常。 >[info]【注意】,這里指的是任何Java的引用類型。在遇到基本類型 int long float double short byte 等的時候,情況就不一樣了。而且還是個坑。編譯器不會報錯,但是運行時會拋NPE。空指針異常。這是Java中的自動拆箱導致的。 代碼示例 ``` Integer nullInt = null; // this is ok int anotherInt = nullInt; // 編譯器允許這么賦值, 但是在運行時拋 NullPointerException ``` >[info]要時刻注意這一點:Integer的默認值是null而不是0。當把null值傳遞給一個int型變量的時候,Java的自動裝箱將會返回空指針異常。 #### **Kotlin中的 null** 在Kotlin中,針對Java中的 null 的雜亂局面,進行了整頓,作了清晰的界定,并在編譯器級別強制規范了可空null變量類型的使用。 ~~~ fun main(args: Array<String>) { //null 跟 null 是相等的 println(null == null)//true println(null != null)//false //null 這個值比較特殊, null 不是 Any 類型 println("null is Any ="+null is Any)//false //null 是 Any? 類型 println("null is Any? ="+null is Any?)//true //null 的類型是 Nothing? var a= null //a=1 // 報錯Error:(14, 7) Kotlin: The integer literal does not conform to the expected type Nothing? //對 null 進行加法運算 //對應的重載運算符的函數定義在 kotlin/Library.kt 里面 println("1"+null)//1null println(null+20)//null20 //但反過來就不可以,因為Int沒有重載傳入 null 參數的 plus() 函數。 //println(1+null) // 報錯error: none of the following functions can be called with the arguments supplied: } ~~~ 查看源碼如下圖Int的plus方法 ![](https://box.kancloud.cn/9944accd8a4ee94f9423d67d4cd3831f_370x571.png) #### **可空類型 String? 與安全調用 ?.** 代碼如下 ![](https://box.kancloud.cn/be79536d14ef53e23f78a1a5ad228dc1_595x197.png) 如上圖,編譯器就直接編譯失敗:`Null can not be a value of a non-null type String`,這樣**通過編譯時強制排除空指針的錯誤,大大減少了出現NPE的可能。然而在Java中這樣編譯時是不報錯可以通過,運行時才能檢測出錯誤**。如下代碼 ![](https://box.kancloud.cn/418de54945c89bc88df4e472569046d1_605x248.png) ![](https://box.kancloud.cn/3c9d4380d0a4fa8aac8cac41c11d9b21_693x125.png) 另外,如果我們確實需要傳入一個可空的參數,我們可以使用可空類型 String? 來聲明一個可以指向空指針的變量。 可空類型可以用來標記任何一個變量,來表明這個變量是可空的(Nullable)。例如: Char? ,Int? , MineType? (自定義的類型)等等。 ![](https://box.kancloud.cn/0d14754d448de69502e82b57ff9f4f5c_458x185.png) 可以看出:普通 String 類型,是不允許指向 null 的;而可空 String? 類可以指向 null 。 使用一個可空變量來調用函數: ![](https://box.kancloud.cn/3b723787b53350f8085f8d8fcb3abb2c_477x203.png) 變量 str: String? 是可空的類型,調用只能通過安全調用 ?. 或者非空斷言調用 !!. 。具體詳情可查看本系列之空安全之安全調用和非空斷言專節,另外,如果異常需要捕獲到進行特殊處理的場景,在Kotlin中仍然使用 try ... catch 捕獲并處理異常。 #### **可空類型的層次體系** 就像 Any 是在非空類型層次結構的根, Any? 是可空類型層次的根。 由于 Any? 是Any的超集,所以, Any? 是Kotlin的類型層次結構的最頂端。 ![](https://box.kancloud.cn/c6dc72dd970e1b14cb9a17a744516182_152x137.png) 代碼示例 ~~~ fun main(args: Array<String>) { println(1 is Any)//true println(1 is Any?)//true println(null is Any)//false println(null is Any?)//true println(Any() is Any?)//true } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看