文章目錄
一.異常概述
學習Java時,常常會遇到編譯程序後,提示出現異常,異常時一個在程序執行期間發生的事件,它中斷了正在執行的程序的正常指令流。
例如下面的代碼:
public class Exceptiontest {
public static void main(String[] args) {
int num=3/0;
System.out.println(num);
}
}
運行結果提示算術異常:
程序運行過程中發生了異常,系統不再執行下去,提前結束,這就是異常。
Java語言是一門面向對象的編程語言,因此,異常在Java語言中也是作爲類的實例的形式出現的。當某一方法中發生錯誤時,這個方法就會創建一個對象,並且把它傳遞給正在運行的系統,這個對象就是異常對象。通過異常處理機制,可以將非正常情況下的處理代碼與程序的主邏輯分離,即在編寫代碼主流程的同時在其他方法處理異常。
常見的異常如下。
二.常見異常
異常類 | 說明 |
---|---|
ClassCastException | 類型轉換異常 |
ClassNotFoundException | 沒找到相應類異常 |
ArithmeticException | 算術異常 |
ArrayIndexOutOfBoundsException | 數組下標越界異常 |
ArrayStoreException | 數組中包含不兼容的值拋出的異常 |
SQLException | 操作數據庫異常類 |
NullPointerException | 空指針異常 |
NoSuchFieldException | 字段未找到異常 |
NoSuchMethodException | 方法未找到拋出的異常 |
NumberFormatException | 字符串轉換爲數字拋出的異常 |
NegativeArraySizeException | 數組元素個數爲負數拋出的異常 |
StringIndexOutOfBoundsException | 字符串索引超出範圍拋出的異常 |
IOException | 輸入輸出異常 |
IllegalAccessException | 不允許訪問某類異常 |
InstantiationException | 當應用程序試圖使用Class類中的newInstance()方法創建一個類的實例,而指定的類對象無法被實例化時,拋出該異常。 |
EOFException | 文件已結束異常 |
FileNotFoundException | 文件未找到異常 |
三.捕捉異常
Java語言的異常捕捉結構由try,catch,finally三個部分構成,其中try語句塊中存的是可能發生異常的Java語句,catch程序塊在try語句塊之後,用來激發被捕捉的異常,finally語句塊是異常處理結構的最後執行部分,無論try語句塊中的代碼如何退出,都將執行finally語句塊,異常處理器大致分爲 try-catch 語句塊和 finally 語句塊。
1. try-catch 語句塊
將代碼稍稍改動:
public class Exceptiontest {
public static void main(String[] args) {
int num=3/0;
System.out.println(num);
System.out.println("繼續運行");
}
}
運行可知,一旦出現異常會終止出現運行。
在添加了異常處理tyr-catch語句塊之後:
public class Exceptiontest {
public static void main(String[] args) {
try {
int num=3/0;
System.out.println(num);
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("繼續運行");
}
}
運行結果可以看出,程序仍然輸出最後的提示信息,沒有因爲異常而終止。
Exception是try代碼塊傳遞給catch代碼塊的變量類型,e是變量名,catch代碼塊中的語句“e.printStackTrace()方法用於指出異常的類型,性質,棧層次已經出現在程序中的位置。”另外兩個方法如下:
getMessage() : 輸出錯誤性質
toString() : 給出異常的類型與性質。
2.finally 語句塊
完整的異常處理語句一定要包含finally語句,無論程序中有無異常發生,並且無論之間的try-catch 語句塊是否順序執行完畢,都會執行finally語句。
在以下4種特殊情況下,finally塊不會被執行:
在finally語句中發生了異常
在前面的代碼中使用了System.exit()退出程序
程序所在的線程死亡
關閉CPU
四.自定義異常
除了內置的異常類,用戶也可以自定義異常,只需要繼承Exception類即可。
步驟如下:
1.創建自定義異常類。
2.在方法中通過throw關鍵字拋出異常對象。
3.如果在當前拋出異常的方法中處理異常,可以使用try-catch語句塊捕捉並處理,否則在方法的聲明處通過throws關鍵字指明要拋出給方法調用者的異常,繼續進行下一步操作。
4.在出現異常的調用者中捕捉並處理異常。
例如:
//創建自定義異常類
class MyException extends Exception{
public MyException(String ErrorMessage) {
super(ErrorMessage);
}
}
//在方法中通過throw關鍵字拋出異常對象
public class Exceptiontest {
static int avg(int number1,int number2) throws MyException{
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 num =avg(155,155);
System.out.print(num);
}catch(MyException e) {
System.out.println(e);
}
}
}
運行結果:
五.在方法中拋出異常
1.使用throws關鍵字拋出異常
throws 關鍵字通常被應用在聲明方法時,用來指定方法可能拋出的異常,多個異常可使用逗號分隔。
如:
int avg(int number1,int number2) throws MyException{
// 。。。。。。
}
使用throws關鍵字將異常拋給上一級後,如果不想處理該異常,可以繼續向上拋出,但最終要有能夠處理該異常的代碼。
2.使用throw關鍵字拋出異常
throw關鍵字通常用於方法體中,並且拋出一個異常對象。程序在執行到throw語句時立即終止,他後面的語句都不執行。通過throw拋出異常後,如果想在上一級代碼中來捕獲並處理異常,則需要在拋出異常的方法中使用throws關鍵字在方法的聲明中指名要拋出的異常,如果要捕捉throw拋出異常,則必須使用try-catch語句塊。
如:
if (number1 < 0 || number2 < 0) {
throw new MyException("不可以使用負數");
}
若有錯誤,歡迎指正批評,歡迎批評。
每文一句:生活不能等別人來安排,要自已去爭取和奮鬥;而不論其結果是喜是悲,但可以慰藉的是,你總不枉在這世界上活了一場。——路遙《平凡的世界》