Java異常處理與常見異常
1、異常概述
在程式中,錯誤可能產生於程式設計師沒有預料到的各種情況,或者是超出了程式設計師可控制範圍的環境因素,如使用者的壞資料、試圖開啟一個根本不存在的檔案等。在Java中這種在程式執行是可能出現的一些錯誤稱為異常。異常是一個在程式執行期間發生的事件,它中斷了正在執行的程式的正常指令流。
2、捕捉異常
Java語言的異常捕獲結構由try、catch和finally3部分組成。其中,try語句塊存放的是可能發生異常的Java語句;catch程式塊在try語句之後,用來激發被捕獲的異常;finally語句塊是異常處理結構的最後執行部分,無論try語句塊中的程式碼如何退出,都將執行finally語句塊。
語句如下:
try{
//程式程式碼塊
} catch(Exceptiontype1 e){
//對Exceptiontype1的處理(如:e.getMessage();)
} catch(Exceptiontype2 e){
//對Exceptiontype2的處理
}
...
finally{
//程式塊
}
使用try-catch語句進行異常處理時,程式不會因為異常而終止。當try程式碼塊中的語句發生異常是,程式就會跳轉到catch程式碼塊中執行,執行完catch程式碼塊中的程式程式碼後,將繼續執行catch程式碼塊後的其他程式碼,而不會執行try程式碼塊中發生異常語句後面的程式碼。
Java的異常處理時結構化的,不會因為一個異常影響整個程式的執行。
注:
Exception是try程式碼快傳遞給catch程式碼塊的變數型別,e是變數名。catch程式碼塊中語句“e.getMessage();”用於輸出錯誤性質。通常,異常處理常用以下3個函式來獲取異常的有關資訊:
getMessage()函式:輸出錯誤性質。
toString()函式:給出異常的型別與性質。
printStackTrace()函式:支出異常的型別、性質、棧層次以及出現在程式中的位置。
3、丟擲異常
1.使用throws關鍵字丟擲異常
throws關鍵字通常被應用在生命方法時,用來指定方法可能丟擲的異常。多個異常可使用逗號分隔。
如:
public class Shoot{//建立類
static void pop() throws NegativeArraySizeException{//定義方法並丟擲異常
int[] arr = new int[-3];//建立陣列
}
public static void main(String[] args){//主方法
try{
pop(); //呼叫pop()方法
} catch (NegativeArraySizeException e){
System.out.print("pop()方法排除的異常");//輸出異常資訊
}
}
}
執行結果:
pop()方法丟擲的異常
使用throws關鍵字將異常拋給上一級後,如果不想處理該異常,可以繼續向上丟擲,但最終要有能夠處理該異常的程式碼。
2.使用throw關鍵字丟擲異常
throw關鍵字通常用於方法體中,並且丟擲一個異常物件。程式在執行到throw語句是立即終止,它後面的語句都不執行。通過throw丟擲異常後,如果想在上一級程式碼中來捕獲並處理異常,則需要再丟擲異常的方法中使用throws關鍵字在方法的宣告中指明要丟擲的異常;如果要捕捉throw丟擲的異常,則必須使用try-catch語句塊。
如:
public class MyException extends Exception{//建立自定義異常類
String message;
public MyException(String ErrorMessagr){//父類方法
message = ErrorMessagr;
}
public String getMessage(){//覆蓋getMessage()方法
return message;
}
}
public class Captor{//建立類
static int quetient(int x,int y)throws MyException{//定義方法丟擲異常
if(y < 0){
throw new MyException("除數不能是負數");//異常資訊
}
returm x/y;//返回值
}
public static void main(String args[]){
try{
int result = quetient(3,-1);
}catch (MyException e){
System.out.print(e.getMessage());//處理自定義異常
}catch (ArithmeticException e){
System.out.print("除數不能為0");//處理ArithmetticException異常
}catch (Exceotion e){
System.out.print("程式發生了其他的異常");//處理其他異常
}
}
}
上述例項使用了多個catch語句來捕捉異常。由於Exception是所有異常類的父類,如果將catch(Exception e)程式碼塊放在其他兩個程式碼塊的前面,後面的程式碼塊將永遠得不到執行,所以catch語句的順序不可調換。
4、執行時異常和一般異常
RuntimeException異常是程式執行過程中產生的異常。Java類庫的每個包中都定義了異常類,所有的這些類都是Throwable類的子類。Throwable類派生了兩個子類,分別是Exception和Error類。Error類及其子類用來描述Java執行系統中的內部錯誤以及資源耗盡的錯誤,這類錯誤比較嚴重。Exception類稱為非致命性類,可以通過捕捉處理使程式繼續執行。
Exceotion類有根據錯誤發生的原因分別為執行時異常(RuntimeException)和一般異常(CheckedException)。對於後者,即一般異常,Java要求我們必須對其進行try-catch或者throws處理;而對於執行時異常我們可以不處理。這樣的異常由虛擬機器接管。出現執行時異常後,系統會把異常一直往上層拋,一直遇到處理程式碼為止。如果不對執行時異常進行處理,那麼出現執行時異常後,要麼是執行緒終止,要麼是主程式終止。對於執行時異常,一般不建議再程式中進行捕獲處理,防止再程式的執行中掩蓋錯誤使其無法被察覺。
5、Java常見異常
常見RuntimeException異常:
NullPointerException空指標異常
ArrayIndexOutOfBoundsException陣列下表越界異常
ArithmeticExceotion算數異常
ArratStoreException陣列中包含不相容的值丟擲的異常
IllegalArgumentException非法引數異常
SecurityException安全性異常
NegativeArratSizeException陣列長度為負異常
更多常見異常:
NumberFormatException數字格式異常
UnsupportedOperationException不支援的操作異常
ClassCastException型別轉換異常
ClassNotFoundException未找到相應類異常
SQLException操作資料庫異常
NoSuchFielException欄位未找到異常
NoSuchMethodException方法為找到丟擲的議程
StringIndexOutOfBoundsException字串索引超出範圍丟擲的異常
IOException輸入輸出異常
IllegalAccessException不允許方位某類異常
InstantiationException當應用程式試圖使用Class類中的newInstance()方法穿件一個類的例項,而指定的類物件無法被例項化是,丟擲該異常
EOFException檔案已結束異常
FileNotFoundException檔案未找到異常
NumberFormatException數字格式異常
UnsupportedOperationException不支援的操作異常
ClassCastException型別轉換異常