<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國際加速解決方案。 廣告
                "異常:try、catch、finally、throw、Nothing" # 異常 [TOC] ## 異常類 Kotlin 中所有異常類都是 `Throwable` 類的子孫類。每個異常都有消息、堆棧回溯信息以及可選的原因。使用 **throw-表達式**來**拋出異常**: ```kotlin fun main() { throw Exception("Hi There!") } ``` 使用 **try-表達式**來**捕獲異常**: ```kotlin try { // 一些代碼 } catch (e: SomeException) { // 處理程序 } finally { // 可選的 finally 塊 } ``` **可以有零到多個 catch 塊。finally塊可以省略。但是 catch與 finally塊至少應該存在一個**。 ### Try 是一個表達式 **與Java不同,try是一個表達式,即它可以有一個返回值**: ```kotlin val a: Int? = try { parseInt(input) } catch (e: NumberFormatException) { null } ``` **try-表達式的返回值是 try塊中的最后一個表達式或者是(所有)catch塊中的最后一個表達式。finally塊中的內容不會影響表達式的結果**。 ``` fun main(args: Array<String>) { val a: Int? = try { 1 //正常運行,返回1 } catch (e: NumberFormatException) { 2 null } finally { 3 //finally塊不會影響表達式結果 } val b: Int? = try { 1 throw NumberFormatException() } catch (e: NumberFormatException) { 2 null //捕獲異常,返回null } finally { 3 //finally塊不會影響表達式結果 } println(a) //輸出1 println(b) //輸出null } ``` ## 受檢的異常 **Kotlin 沒有受檢的異常**。這其中有很多原因,但我們會提供一個簡單的例子。 以下是 JDK 中 `StringBuilder` 類實現的一個示例接口: ``` java Appendable append(CharSequence csq) throws IOException; ``` 這個簽名是什么意思? 它是說,每次我追加一個字符串到一些東西(一個 `StringBuilder`、某種日志、一個控制臺等)上時我就必須捕獲那些 `IOException`。 為什么?因為它可能正在執行 IO 操作(`Writer` 也實現了 `Appendable`)…… 所以它導致這種代碼隨處可見的出現: ```kotlin try { log.append(message) } catch (IOException e) { // 必須要安全 } ``` 這并不好,參見[《Effective Java》第三版](http://www.oracle.com/technetwork/java/effectivejava-136174.html) 第 77 條:*不要忽略異常*。 Bruce Eckel 在[《Java 是否需要受檢的異常?》(Does Java need Checked Exceptions?)](http://www.mindview.net/Etc/Discussions/CheckedExceptions) 中指出: > 通過一些小程序測試得出的結論是異常規范會同時提高開發者的生產力與代碼質量,但是大型軟件項目的經驗表明一個不同的結論——生產力降低、代碼質量很少或沒有提高。 其他相關引證: * [《Java 的受檢異常是一個錯誤》(Java's checked exceptions were a mistake)](http://radio-weblogs.com/0122027/stories/2003/04/01/JavasCheckedExceptionsWereAMistake.html)(Rod Waldhoff) * [《受檢異常的煩惱》(The Trouble with Checked Exceptions)](http://www.artima.com/intv/handcuffs.html)(Anders Hejlsberg) ## Nothing 類型 **在 Kotlin 中 `throw` 是表達式,所以你可以使用它(比如)作為 Elvis 表達式的一部分**: ```kotlin val s = person.name ?: throw IllegalArgumentException("Name required") ``` `throw`表達式的類型是特殊類型 `Nothing`。該類型沒有值,而是用于標記永遠不能達到的代碼位置。在你自己的代碼中,你可以使用 `Nothing` 來標記一個永遠不會返回的函數: ```kotlin fun fail(message: String): Nothing { throw IllegalArgumentException(message) } ``` 當你調用該函數時,編譯器會知道執行不會超出該調用: ```kotlin val s = person.name ?: fail("Name required") println(s) // 在此已知“s”已初始化 ``` 可能會遇到這個類型的另一種情況是類型推斷。這個類型的可空變體`Nothing?` 有一個可能的值是 `null`。如果用 `null` 來初始化一個要推斷類型的值,而又沒有其他信息可用于確定更具體的類型時,編譯器會推斷出 `Nothing?` 類型: ```kotlin val x = null // “x”具有類型 `Nothing?` val l = listOf(null) // “l”具有類型 `List<Nothing?> ``` 示例: ``` fun main(args: Array<String>) { fun fail(message: String): Nothing { throw IllegalArgumentException(message) } //當調用該函數fail()時,編譯器會知道執行不會超出該調用(說白了就是程序不會繼續執行) //程序中斷,輸出 "java.lang.IllegalArgumentException: Name參數錯誤,不能為null" val name = null val s: String = name ?: fail("Name參數錯誤,不能為null") println(s) } ``` 運行結果 ``` Exception in thread "main" java.lang.IllegalArgumentException: Name參數錯誤,不能為null at FileKt$main$1.invoke (File.kt:3) at FileKt.main (File.kt:9) ``` ## Java 互操作性 與 Java 互操作性相關的信息,請參見 [Java 互操作性章節](http://www.kotlincn.net/docs/reference/java-interop.html)中的異常部分。 在Kotlin中,所有異常都是非受檢的,意味著編譯器不會強迫捕獲任何異常(try catch)!因此,在Kotlin中調用一個受檢異常的Java方法,不會強迫你去捕獲異常: ``` //kotlin代碼,調用java方法,append(CharSequence csq) throws IOException; fun render(list: List<*>, to: Appendable) { for (item in list) { //在kotlin中不要求捕獲異常,但在Java中會強迫捕獲異常IOException to.append(item.toString()) } } ```
                  <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>

                              哎呀哎呀视频在线观看