1. 程式人生 > >Java異常處理與常見異常

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型別轉換異常