1. 程式人生 > >Java異常(違例)與捕獲

Java異常(違例)與捕獲

異常與捕獲

異常的分類

  • 幾乎所有的程式碼都會出現異常,為了保證程式在出現異常之後可以正常執行完畢,就需要異常處理。

  • 在java程式設計語言中,異常物件都是派生於Throwable類的一個例項

  • 下圖是java異常層次結構的一個簡化示意圖
    在這裡插入圖片描述

  • 所有的異常都是有Throwable繼承而來,但在下一層立即分解為兩個分支:Error和Exception

  • Error(棧溢位異常):Error類描述Java執行時內部錯誤與資源耗盡錯誤。應用程式不丟擲此類異常,這種內部錯誤一旦出現,除了告知使用者並使程式安全終止之外,別無他法

  • Exception層次結構又分解為兩個分支RuntimeException(執行時異常) :由於程式錯誤導致的異常
    IOException:程式本身沒有問題,但由於出現I/O問題導致的異常(例如:開啟一個並不存在的檔案)

  • java語言規範將繼承於Error與RuntimeException類的所有異常子類稱為非受查異常

    (不強制使用者進行異常處理);所有其他的異常稱為受查異常

異常的處理格式

  • 為了保證程式出現異常後也能正常執行下去,需要進行異常處理
  • 在遇到一個異常之後,java便把異常拋了出來,可是丟擲來後沒有程式程式碼區捕獲它,所以程式就會結束,不會接著執行;如果加上捕獲異常的程式程式碼,則可針對不同的異常做不同的處理,這種處理的方式稱為異常處理
  • 異常處理是由try,catch,finally3個關鍵字所組成的程式塊,語法如下:
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