Java異常(違例)與捕獲
阿新 • • 發佈:2018-11-19
異常與捕獲
異常的分類
-
幾乎所有的程式碼都會出現異常,為了保證程式在出現異常之後可以正常執行完畢,就需要異常處理。
-
在java程式設計語言中,異常物件都是派生於Throwable類的一個例項
-
下圖是java異常層次結構的一個簡化示意圖
-
所有的異常都是有Throwable繼承而來,但在下一層立即分解為兩個分支:Error和Exception
-
Error(棧溢位異常):Error類描述Java執行時內部錯誤與資源耗盡錯誤。應用程式不丟擲此類異常,這種內部錯誤一旦出現,除了告知使用者並使程式安全終止之外,別無他法
-
Exception層次結構又分解為兩個分支;RuntimeException(執行時異常) :由於程式錯誤導致的異常
IOException:程式本身沒有問題,但由於出現I/O問題導致的異常(例如:開啟一個並不存在的檔案) -
java語言規範將繼承於Error與RuntimeException類的所有異常子類稱為非受查異常
異常的處理格式
- 為了保證程式出現異常後也能正常執行下去,需要進行異常處理
- 在遇到一個異常之後,java便把異常拋了出來,可是丟擲來後沒有程式程式碼區捕獲它,所以程式就會結束,不會接著執行;如果加上捕獲異常的程式程式碼,則可針對不同的異常做不同的處理,這種處理的方式稱為異常處理
- 異常處理是由
try,catch,finally
3個關鍵字所組成的程式塊,語法如下:
try{ // 要檢查的語句(有可能出現異常的語句) }[catch(異常類 物件名稱] { //出現異常後的解決方案 }[finally{ //異常出口,無論是否產生異常,均會執行finally程式碼塊 } ] 1.首先,我們把所有可能出現異常的語句都放在一個try之後的{ }所形成的區塊中; 程式通過try{ }區塊準備捕獲異常,try區塊要是有異常發生,程式的執行便中斷,並丟擲“異常類所產生的物件” 2.丟擲的物件如果屬於catch()括號內想要捕獲的異常類,catch則會捕獲此異常,然後進入catch的塊裡繼續執行 3.無論是否產生異常,最終一定會執行finally塊裡的程式程式碼 //即便try,catch中存在return語句,也會在return之前執行finally程式碼塊 //如果finally裡面沒有return,則程式碼正常返回 finally塊是可以省略的,可以有以下組合: try..catch try..finally try...catch...fianlly..
- 當異常發生時,通常可以用兩種方法來處理,一種交由java預設的異常處理機制做處理,但這種處理方式,java通常只能輸出異常資訊,接著便終止程式的執行;另一種處理方式是用自行編寫的try–catch–finally塊來捕獲異常,可以靈活的操控程式的流程,做出最適當的處理
throws關鍵字
- 用throws關鍵字宣告的方法表示此方法不處理異常,而由系統自動將捕獲的異常資訊拋給上級呼叫方法
訪問許可權 返回值型別 方法名稱 (引數列表) throws 異常類
{
//方法體;
}
若有異常,則將該異常提交給直接使用這個方法的方法
- throws用在方法上
public class Test{
public static void main(String[] args) {
try{
System.out.println(caculate(10,0));
}catch(Exception e){
e.printStackTrace();
}
}
public static int caculate(int x,int y)throws Exception{
return x/y;
}
}
- 主方法丟擲異常,這個時候產生的異常就會交給JVM處理
public class Test{
public static void main(String[] args)throws Exception {
System.out.println(calculate(10,0));
}
public static int calculate(int x,int y)throws Exception{
return x/y;
}
}
throw關鍵字
- 所有異常類物件都是由JVM自動化例項的,但有時使用者希望能親自進行異常類物件的例項化操作,自己手工丟擲異常,那麼此時就需要依靠throw關鍵字來完成
public class Test{
public static void main(String[] args) {
try{
throw new Exception("拋個異常");
}catch(Exception e){
e.printStackTrace();
}
}
}
throws和throw區別
- 1. throws用於方法內部,主要表示手工異常丟擲
- 2.throws主要在方法宣告上使用,明確告訴使用者本方法可能產生的異常,同時該方法可能不處理異常
Exception與RuntimeException的區別
- 使用Exception是RuntimeException的父類,使用Exception定義的異常都要求必須使用異常處理,而使用的RuntimeException定義的異常可以由使用者選擇性的來進行異常處理
java中幾個常見的異常
算術異常:ArithmeticException
空指標異常:NullPointerException
檔案未找到異常:FileNotFoundException
陣列下標越界異常:ArrayIndexOutOfBoundsException
記憶體不足異常:OutOfMemoryException