<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 9.3 標準Java異常 Java包含了一個名為`Throwable`的類,它對可以作為異常“拋”出的所有東西進行了描述。`Throwable`對象有兩種常規類型(亦即“從`Throwable`繼承”)。其中,`Error`代表編譯期和系統錯誤,我們一般不必特意捕獲它們(除在特殊情況以外)。`Exception`是可以從任何標準Java庫的類方法中“拋”出的基本類型。此外,它們亦可從我們自己的方法以及運行期偶發事件中“拋”出。 為獲得異常的一個綜合概念,最好的方法是閱讀由`http://java.sun.com`提供的聯機Java文檔(當然,首先下載它們更好)。為了對各種異常有一個大概的印象,這個工作是相當有價值的。但大家不久就會發現,除名字外,一個異常和下一個異常之間并不存在任何特殊的地方。此外,Java提供的異常數量正在日益增多;從本質上說,把它們印到一本書里是沒有意義的。大家從其他地方獲得的任何新庫可能也提供了它們自己的異常。我們最需要掌握的是基本概念,以及用這些異常能夠做什么。 ``` java.lang.Exception ``` 這是程序能捕獲的基本異常。其他異常都是從它派生出去的。這里要注意的是異常的名字代表發生的問題,而且異常名通常都是精心挑選的,可以很清楚地說明到底發生了什么事情。異常并不全是在`java.lang`中定義的;有些是為了提供對其他庫的支持,如`util`,`net`以及`io`等——我們可以從它們的完整類名中看出這一點,或者觀察它們從什么繼承。例如,所有IO異常都是從`java.io.IOException`繼承的。 ## 9.3.1 `RuntimeException`的特殊情況 本章的第一個例子是: ``` if(t == null) throw new NullPointerException(); ``` 看起來似乎在傳遞進入一個方法的每個引用中都必須檢查`null`(因為不知道調用者是否已傳遞了一個有效的引用),這無疑是相當可怕的。但幸運的是,我們根本不必這樣做——它屬于Java進行的標準運行期檢查的一部分。若對一個空引用發出了調用,Java會自動產生一個`NullPointerException`異常。所以上述代碼在任何情況下都是多余的。 這個類別里含有一系列異常類型。它們全部由Java自動生成,毋需我們親自動手把它們包含到自己的異常規范里。最方便的是,通過將它們置入單獨一個名為`RuntimeException`的基類下面,它們全部組合到一起。這是一個很好的繼承例子:它建立了一系列具有某種共通性的類型,都具有某些共通的特征與行為。此外,我們沒必要專門寫一個異常規范,指出一個方法可能會“拋”出一個`RuntimeException`,因為已經假定可能出現那種情況。由于它們用于指出編程中的錯誤,所以幾乎永遠不必專門捕獲一個“運行期異常”——`RuntimeException`——它在默認情況下會自動得到處理。若必須檢查`RuntimeException`,我們的代碼就會變得相當繁復。在我們自己的包里,可選擇“拋”出一部分`RuntimeException`。 如果不捕獲這些異常,又會出現什么情況呢?由于編譯器并不強制異常規范捕獲它們,所以假如不捕獲的話,一個`RuntimeException`可能過濾掉我們到達`main()`方法的所有途徑。為體會此時發生的事情,請試試下面這個例子: ``` //: NeverCaught.java // Ignoring RuntimeExceptions public class NeverCaught { static void f() { throw new RuntimeException("From f()"); } static void g() { f(); } public static void main(String[] args) { g(); } } ///:~ ``` 大家已經看到,一個`RuntimeException`(或者從它繼承的任何東西)屬于一種特殊情況,因為編譯器不要求為這些類型指定異常規范。 輸出如下: ``` java.lang.RuntimeException: From f() at NeverCaught.f(NeverCaught.java:9) at NeverCaught.g(NeverCaught.java:12) at NeverCaught.main(NeverCaught.java:15) ``` 所以答案就是:假若一個`RuntimeException`獲得到達`main()`的所有途徑,同時不被捕獲,那么當程序退出時,會為那個異常調用`printStackTrace()`。 注意也許能在自己的代碼中僅忽略`RuntimeException`,因為編譯器已正確實行了其他所有控制。因為`RuntimeException`在此時代表一個編程錯誤: (1) 一個我們不能捕獲的錯誤(例如,由客戶程序員接收傳遞給自己方法的一個空引用)。 (2) 作為一名程序員,一個應在自己的代碼中檢查的錯誤(如`ArrayIndexOutOfBoundException`,此時應注意數組的大小)。 可以看出,最好的做法是在這種情況下異常,因為它們有助于程序的調試。 另外一個有趣的地方是,我們不可將Java異常劃分為單一用途的工具。的確,它們設計用于控制那些討厭的運行期錯誤——由代碼控制范圍之外的其他力量產生。但是,它也特別有助于調試某些特殊類型的編程錯誤,那些是編譯器偵測不到的。
                  <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>

                              哎呀哎呀视频在线观看