<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國際加速解決方案。 廣告
                ## 什么是異常 盡管人人希望自己身體健康,處理的事情都能順利進行,但在實際生活中總會遇到各種狀況,比如感冒發燒,工作時電腦藍屏、死機等。同樣在程序運行的過程中,也會發生各種非正常狀況,比如程序運行時磁盤空間不足,網絡連接中斷,被裝載的類不存在。針對這種情況,在Java語言中,引入了異常,以異常類的形式對這些非正常情況進行封裝,通過異常處理機制對程序運行時發生的各種問題進行處理。接下來通過一個案例來認識一下什么是異常,如例所示。 ```java public class Example { public static void main(String[] args) { int result = divide(4, 0); // 調用divide()方法 System.out.println(result); } // 下面的方法實現了兩個整數相除 public static int divide(int x, int y) { int result = x / y; // 定義一個變量result 記錄兩個數相除的結果 return result; // 將結果返回 } } ``` 運行結果: ``` Exception in thread "main" java.lang.ArithmeticException: / by zero at Example.divide(Example.java:9) at Example.main(Example.java:3) ``` 從運行結果可以看出,程序發生了算數異常(ArithmeticException),這個異常是由于程序中的第3行代碼調用divide()方法時傳入了參數0,在方法中的第8行代碼的運算中出現了被0除的錯誤。在這個異常發生后,程序會立即結束,無法繼續向下執行。 例中產生了一個ArithmeticException異常,ArithmeticException異常只是Java異常類中的一種,在Java中還提供了大量的異常類,這些類都繼承自java.lang.Throwable類。接下來通過一張圖來展示Throwable類的繼承體系,如圖所示。 ![](http://47.107.171.232/easily-j/images/20190108/87f56d7b-d911-4ade-892c-c392dfc409b6.png) 通過圖可以看出,Throwable有兩個直接子類Error和Exception,其中Error代表程序中產生的錯誤,Exception代表程序中產生的異常。接下來就對這兩個直接子類進行詳細講解。 - Error類 Error類稱為錯誤類,它表示Java運行時產生的系統內部錯誤或資源耗盡的錯誤,是比較嚴重的,僅靠修改程序本身是不能恢復執行的。舉一個生活中的例子,在蓋樓的過程中因偷工減料,導致大樓坍塌,這就相當于一個Error。 - Exception類 Exception類稱為異常類,它表示程序本身可以處理的錯誤,在開發Java程序中進行的異常處理,都是針對Excption類及其子類。在Exception類的眾多子類中有一個特殊的RuntimeException類,該類及其子類用于表示運行時異常,除了此類,Exception類下所有其他的子類都用于表示編譯時異常。本節主要針對Exception類及其子類進行講解。 通過前面的學習我們已經了解了Throwable類,為了方便后面的學習,接下來將Throwable類中的常用方法羅列出來,如表所示。 ![](http://47.107.171.232/easily-j/images/20190108/52da4fe8-0876-499e-9e89-99b314e8638f.png) 表中的這些方法都用于獲取異常信息。由于Error和Exception 繼承自Throwable類,所以它們都擁有這些方法,在后面的異常學習中會逐漸接觸到這些方法的使用。 ## try…catch和finally 上面的例子中,由于發生了異常,程序立即終止,無法繼續向下執行。為了解決這樣的問題,Java中提供了一種對異常進行處理的方式———異常捕獲。異常捕獲通常使用try…catch語句,具體語法格式如下: ``` try{ //程序代碼塊 }catch(ExceptionType(Exception 類及其子類) e){ //對ExceptionType 的處理 } ``` 其中在try代碼塊中編寫可能發生異常的Java語句,catch代碼塊中編寫針對異常進行處理的代碼。當try代碼塊中的程序發生了異常,系統會將這個異常的信息封裝成一個異常對象,并將這個對象傳遞給catch代碼塊。catch代碼塊需要一個參數指明它所能夠接收的異常類型,這個參數的類型必須是Exception類或其子類。 接下來使用try…catch語句對上面例中出現的異常進行捕獲。 ```java public class Example { public static void main(String[] args) { // 下面的代碼定義了一個try…catch 語句用于捕獲異常 try { int result = divide(4, 0); // 調用divide()方法 System.out.println(result); } catch (Exception e) { // 對異常進行處理 System.out.println("捕獲的異常信息為: " + e.getMessage()); } System.out.println("程序繼續向下執行……"); } // 下面的方法實現了兩個整數相除 public static int divide(int x, int y) { int result = x / y; // 定義一個變量result 記錄兩個數相除的結果 return result; // 將結果返回 } } ``` 運行結果: ``` 捕獲的異常信息為: / by zero 程序繼續向下執行…… ``` 例中,對可能發生異常的代碼用try…catch語句進行了處理。在try代碼塊中發生被0 除異常,程序會轉而執行catch 中的代碼,通過調用Exception 對象的getMessage()方法,返回異常信息“/byzero”。catch代碼塊對異常處理完畢后,程序仍會向下執行,而不會異常終止。 在程序中,有時候我們希望有些語句無論程序是否發生異常都要執行,這時就可以在try…catch 語句后,加一個finally代碼塊。接下來對例4-22 進行修改,演示一下finally代碼塊的用法,如例所示。 ```java public class Example { public static void main(String[] args) { // 下面的代碼定義了一個try…catch 語句用于捕獲異常 try { int result = divide(4, 0); // 調用divide()方法 System.out.println(result); } catch (Exception e) { // 對異常進行處理 System.out.println("捕獲的異常信息為: " + e.getMessage()); } finally { System.out.println("進入finally 代碼塊"); } System.out.println("程序繼續向下執行……"); } // 下面的方法實現了兩個整數相除 public static int divide(int x, int y) { int result = x / y; // 定義一個變量result 記錄兩個數相除的結果 return result; // 將結果返回 } } ``` 運行結果: ``` 捕獲的異常信息為: / by zero 進入finally 代碼塊 程序繼續向下執行…… ``` 在catch代碼塊中增加了一個return語句,用于結束當前方法,此時程序第12行代碼就不會執行了,而finally中的代碼仍會執行,并不會被return語句所影響,也就是說不論程序是發生異常還是使用return語句結束,finally中的語句都會執行,正是由于這種特殊性,在程序設計時,經常會在try…catch后使用finally代碼塊來完成必須做的事情,例如釋放系統資源。 需要注意的是,finally中的代碼塊有一種情況下是不會執行的,那就是在try…catch中執行了System.exit(0)語句。System.exit(0)表示退出當前的Java虛擬機,Java虛擬機停止了,任何代碼都不能再執行了。 ## throws關鍵字 在前面學習的例中,由于調用的是自己寫的divide()方法,因此很清楚該方法可能會發生異常。試想一下,如果去調用一個別人寫的方法時,是否能知道別人寫的方法是否會有異常呢? 這是很難做出判斷的。針對這種情況,Java中允許在方法的后面使用throws關鍵字對外聲明該方法有可能發生的異常,這樣調用者在調用方法時,就明確地知道該方法有異常,并且必須在程序中對異常進行處理,否則編譯無法通過。 throws關鍵字聲明拋出異常的語法格式如下: ``` 修飾符返回值類型方法名([參數1,參數2…])throws ExceptionType1[,ExceptionType2…]{ } ``` 從上述語法格式中可以看出,throws關鍵字需要寫在方法聲明的后面,throws后面需要聲明方法中發生異常的類型,通常將這種做法稱為方法聲明拋出一個異常。然后使用同樣的try catch 結構拋出異常,就保證了程序執行時不會終止,接下來對例進行修改,在devide()方法上聲明拋出異常,如例所示。 ```java public class Example { public static void main(String[] args) { // 下面的代碼定義了一個try…catch 語句用于捕獲異常 try { int result = divide(4, 2); // 調用divide()方法 System.out.println(result); } catch (Exception e) { // 對捕獲到的異常進行處理 e.printStackTrace(); // 打印捕獲的異常信息 } } // 下面的方法實現了兩個整數相除,并使用throws 關鍵字聲明拋出異常 public static int divide(int x, int y) throws Exception { int result = x / y; // 定義一個變量result 記錄兩個數相除的結果 return result; // 將結果返回 } } ``` 運行結果: ``` 2 ``` ## 運行時異常與編譯時異常 在實際開發中,經常會在程序編譯時產生一些異常,而這些異常必須要進行處理,這種異常被稱為編譯時異常,也稱為checked異常。另外還有一種異常是在程序運行時產生的,這種異常即使不編寫異常處理代碼,依然可以通過編譯,因此稱為運行時異常,也稱為unchecked異常。接下來就分別對這兩種異常進行詳細的講解。 #### 編譯時異常 在Java中,Exception類中除了RuntimeException類及其子類都是編譯時異常。編譯時異常的特點是Java編譯器會對其進行檢查,如果出現異常就必須對異常進行處理,否則程序無法通過編譯。 處理編譯時期的異常有兩種方式,具體如下: - 使用try…catch語句對異常進行捕獲。 - 使用throws關鍵字聲明拋出異常,調用者對其處理。 #### 運行時異常 RuntimeException類及其子類都是運行時異常。運行時異常的特點是Java編譯器不會對其進行檢查,也就是說,當程序中出現這類異常時,即使沒有使用try…catch語句捕獲或使用throws關鍵字聲明拋出,程序也能編譯通過。運行時異常一般是由程序中的邏輯錯誤引起的,在程序運行時無法恢復。比如通過數組的角標訪問數組的元素時,如果超過了數組的最大角標,就會發生運行時異常,代碼如下所示: ``` int [] arr = new int[5]; System.out.println(arr[6]); ``` 上面代碼中,由于數組arr的length為5,最大角標應為4,當使用arr[6]訪問數組中的元素就會發生數組角標越界的異常。 ## 自定義異常 JDK中定義了大量的異常類,雖然這些異常類可以描述編程時出現的大部分異常情況,但是在程序開發中有時可能需要描述程序中特有的異常情況,例如在設計divide()方法時不允許被除數為負數。為了解決這個問題,在Java中允許用戶自定義異常,但自定義的異常類必須繼承自Exception或其子類。接下來通過一個案例來學習,如例所示。 ```java //下面的代碼是自定義一個異常類繼承自Exception public class DivideByMinusException extends Exception { public DivideByMinusException() { super(); // 調用Exception 無參的構造方法 } public DivideByMinusException(String message) { super(message); // 調用Exception 有參的構造方法 } } ``` 在實際開發中,如果沒有特殊的要求,自定義的異常類只需繼承Exception類,在構造方法中使用super()語句調用Exception的構造方法即可。 既然自定義了異常,那么該如何使用呢? 這時就需要用到throw關鍵字,throw關鍵字用于在方法中聲明拋出異常的實例對象,其語法格式如下: ``` throw Exception 異常對象 ``` 接下來重新對上面被除數為0的例子中的divide()方法進行改寫,在divide()方法中判斷被除數是否為負數,如果為負數,就使用throw 關鍵字在方法中向調用者拋出自定義的DivideByMinusException異常對象,如例所示。 ```java public class Example { public static void main(String[] args) { // 下面的代碼定義了一個try…catch 語句用于捕獲異常 try { // 調用divide()方法,傳入一個負數作為被除數 int result = divide(4, -2); System.out.println(result); } catch (DivideByMinusException e) { // 對捕獲到的異常進行處理 System.out.println(e.getMessage()); // 打印捕獲的異常信息 } } // 下面的方法實現了兩個整數相除,并使用throws 關鍵字聲明拋出自定義異常 public static int divide(int x, int y) throws DivideByMinusException { if (y < 0) { // 使用throw 關鍵字聲明異常對象 throw new DivideByMinusException("被除數是負數"); } int result = x / y; // 定義一個變量result 記錄兩個數相除的結果 return result; // 將結果返回 } } ``` 運行結果: ``` 被除數是負數 ``` 例的main()方法中,定義了一個try…catch語句用于捕獲divide()方法拋出的異常。在調用divide()方法時由于傳入的被除數不能為負數,程序會拋出一個自定義異常DivideByMinusException,該異常被捕獲后最終被catch代碼塊處理,并打印出異常信息。
                  <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>

                              哎呀哎呀视频在线观看