java程式設計入門4 異常處理
異常處理
異常的定義
1.異常是在程式碼序列執行時出現的非正常事件,是特殊的執行錯誤物件。異常的發生將阻止程式正常執行,並可能出現以下兩種情況。
1)程式執行終止,控制權返回給作業系統
2)程式執行終止,系統宕機崩潰狀態
異常類
1.java提供了以Throwable類為基類的一系列異常類和錯誤類。throwable有兩個直接的子類--Error(錯誤類)和Exception(異常類),Error類代表程式出現的錯誤,如程式執行時系統內部錯誤或資源耗盡等。這種錯誤是不能通過修改程式程式碼來恢復的。Exception類,代表程式出現的異常。
2.Exception類包括執行異常類(RuntimeException及其子類)和非執行異常類,執行異常類的產生一般由程式設計師的程式設計錯誤引起,完全可以通過改程序序避免,所以java編譯器對此類異常不進行檢查。非執行異常類是由執行環境引發的異常,eg:檔案讀寫錯誤,資料庫連線不通,找不到檔案等。所以java編譯器要求java程式必須捕捉或處理所有非執行異常。
常見的異常類
異常類 | 異常類描述 | 異常類別 |
ArithmeticException | 算術錯誤 | 執行異常 |
ArrayOutOfBoundsException | 陣列越界使用 | 執行異常 |
NullPointerException | 引用空物件 | 執行異常 |
IllegalArgumentException | 引數無效 | 執行異常 |
NumberFormatException | 資料格式不對 | 執行異常 |
SecurityException | 安全性錯誤 | 執行異常 |
ClassNotFoundException | 未找到欲裝載的類 | 非執行異常 |
FileNotFoundException | 未找到指定的檔案或目錄 | 非執行異常 |
IOException | 輸入、輸出錯誤 | 非執行異常 |
InterruptedException | 執行緒在睡眠、等待或其他原因暫停時被其他程序打斷 | 非執行異常 |
Throwable常見方法
方法宣告 | 功能描述 |
String getMessage() | 輸出錯誤性質 |
String toString() | 給出異常的型別與性質 |
void printStackTrace() | 指出異常的型別、性質、棧層次及出現在程式中的位置並輸出至標準錯誤流 |
void printStackTrace(PrintStream s) | 指出異常的型別、性質、棧層次及出現在程式中的位置並輸出至指定的輸出流 |
異常處理
1.java中異常處理是通過try……catch……fianlly語句來實現的,具體格式為:
try{ 可能丟擲異常的語句 } catch(異常型別1 異常物件){ 對異常型別1物件的處理 } catch(異常型別2 異常物件){ 對異常型別2物件的處理 } …… …… …… catch(異常型別n 異常物件){ 對異常型別n物件的處理 } finally{ 不管是否出現異常,必須執行的語句 }
說明:
1)將有可能出現異常的程式碼用try-catch語句塊進行處理,當try語句塊中的程式碼執行出現異常時,則進入catch語句塊,從上至下依次與catch語句塊中的異常型別進行查詢匹配(檢查以丟擲的異常物件型別是否與該catch語句塊中指定的異常型別相同或為其子類)執行完catch程式碼塊中的程式程式碼後,將繼續執行catch程式碼塊後的其他程式碼,而不會執行try程式碼塊中發生異常語句後面的程式碼。
2)在異常處理中,最多有一個catch語句塊會被執行。另外,如果有多個catch語句塊,且catch語句塊中的引數所指定的異常型別有父子繼承關係,則要求處理子類異常的catch語句塊放在處理父類異常的catch語句塊的前面。否則會出現編譯錯誤。
3)由於finally語句塊中的程式碼肯定會被執行,所以通常在finally語句塊中進行資源的清除工作。
在方法中丟擲異常
1.若某個方法可能會發生異常,但不想在當前方法中處理這個異常,則可以使用throws、throw關鍵字在方法中丟擲異常。
使用throws關鍵字丟擲異常
1)throws關鍵字通常被應用在宣告方法時,用來指定方法可能丟擲的異常。多個異常可使用逗號分隔。
2)如果是Error、RuntimeException或它們的子類,可以不使用throws關鍵字來宣告要丟擲的異常,編譯仍能順利通過,但在執行時會被系統丟擲。
使用throw關鍵字丟擲異常
1)throw關鍵字通常用於方法體中,並且丟擲一個異常物件。程式在執行到throw語句時立即終止,它後面的語句都不執行。通過throw丟擲異常後,如果想在上一級程式碼中來捕獲並處理異常,則需要在丟擲異常的方法中使用throws關鍵字在方法的宣告中指定要丟擲的異常;如果要捕獲throw丟擲的異常,則必須使用try-catch語句塊。
2)throw通常用來丟擲使用者自定義異常。
自定義異常類
1.自定義異常類必須繼承Exception類或其子類
class MyException extends Exception{ public MyException(String ErrorMessage) { super(ErrorMessage); } }
2.自定義異常的丟擲
1)自定義異常不可能依賴系統自動丟擲,因為系統不知道錯誤在哪裡,所以需在自定義的出錯位置藉助於throw語句丟擲自定義的異常類物件。用throw語句丟擲異常物件的語法格式為:
修飾符 返回型別 方法名(引數列表)throws 異常類名列表{ …… …… …… throw 異常類物件 …… …… …… }
說明:
1)一般這種丟擲異常的語句應該被定義為在滿足一定條件時執行。
2)含有throw語句的方法。應該在方法頭定義中增加“throws 異常類名列表"。如果方法中的throw語句中不止一個,則在異常類名列表中一一列出,中間用逗號隔開。
public class Test { static int dev(int number1,int number2) throws MyException,IOException{ if(number1<0||number2<0) { throw new MyException("不可以使用負數"); } if(number1>100||number2>100) { throw new MyException("數值太大"); } return number1/number2; } public static void main(String[] args) { try { int result=dev(10,0); System.out.println(result); } catch(MyException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } } }
異常使用原則
1.在當前方法宣告中使用try-catch語句捕獲異常
2.一個方法被覆蓋時,覆蓋它的方法必須丟擲相同的異常或異常的子類
3.如果父類丟擲多個異常,則覆蓋方法必須丟擲那些異常的一個子集,不能丟擲新異常
注:Error、RuntimeException或它們的子類,可以不使用throws關鍵字來宣告要丟擲的異常
//原則2 public class Text extends father{ public void fun() throws ClassNotFoundException{ } public static void main(String[] args) { } } class father { public void fun() throws IOException,ClassNotFoundException{ } } //原則3 public class Text extends father{ public void fun() throws ClassNotFoundException,FileNotFoundException{ } public static void main(String[] args) { } } class father { public void fun() throws IOException,ClassNotFoundException{ } public void fun1() throws FileNotFoundException{ } }
2018-11-25