1. 程式人生 > >Java語言中的異常處理機制

Java語言中的異常處理機制

     Java中有一個Throwable的類,它有兩個子類,一個是Error類,另一個是Exception類。對於錯誤而言,是很難解決的,比如記憶體溢位等,不能夠通過異常處理來解決;異常是程式中發生的不正常事件流,比如10除以0, 檔案不存在等,需要程式設計師關心,通過處理程式讓程式繼續執行下去。但是錯誤是無法控制的,程式肯定要中斷。
    異常分為執行期異常(RuntimeException)和編譯期異常(CheckedException)
    執行期異常:程式執行時丟擲的異常,編譯器不會強制處理,在執行期才會處理的異常,這是就需要程式設計師找到該異常,並修改。
    編譯期異常:出去執行期異常其他都為編譯期異常,程式是正確的,但因為外界條件不滿足會引發異常,此時編譯器會強制要求處理這類異常。這就需要用到throw、throws、try、catch。
public class A {

    public void a(int i) {

        try{
            System.out.println("1.");

            b(i);
            System.out.println("2.");

        }catch(IOException e){
            System.out.println("3.1");
            e.printStackTrace();
        }
        catch(SQLException e){
            System.out
.println("3.2"); e.printStackTrace(); } catch(Exception e){ System.out.println("3.3"); e.printStackTrace(); } System.out.println("4."); } public void b(int i) throws IOException,SQLException{ if(i>20){ throw
new SQLException("錯錯錯"); } if(i>5){ throw new IOException("報錯");} } public static void main(String[] args) { A a=new A(); a.checkedException(2); } }
   在上述程式碼中我們看到了,方法b中有一個int引數i,當i大於20時,用throw丟擲SQLException,i大於5時throwIOException,當你丟擲了異常但是不做處理編譯器就會報錯,此時你可以throws給上一級,用在方法上,可以用throws一層一層的拋給上一級,但是這個異常總是要解決的,程式設計師也需要分析程式碼,在合適的地方解決這個異常,解決異常時就需要用到try和catch,try就是找到這個異常,一旦找到異常後面的程式碼塊便不會執行,跳到catch去,catch到哪個異常就執行catch花括號裡面的程式碼。
   在Java語言異常處理機制中還有兩個關鍵字:finally和return,簡單來說finally程式碼塊裡的程式碼是無論如何都會執行的,且只能有一個finally。return就是返回,後面的不執行了。
 比如在return中使用finally

public class MultipleReturns {
    public static void f(int i){
        System.out.println("Initialization that requires cleanup");
    try{
        System.out.println("Point 1");
    if(i==1) return;
        System.out.println("Point 2");
    if(i==2) return;
        System.out.println("Point 3");
    if(i==3) return;
        System.out.println("End");
            return;
        }
    finally{
    System.out.println("Performing cleanup.");
        }
}
    public static void main(String[] args) {
    for(int i=1;i<=4;i++){
    f(i);
        }
    }
} 
   無論從何處return,finally裡的內容都會執行,還需要注意以下幾點:
     1. try-catch-finally裡都沒有return ,finally 之後有個return ,如果try中有異常,finally執行完後,還能執行return嗎?
     2. 在存在try-catch-finally的方法中,return可能出現的位置有4個,在try中,在catch中,在finally中,在finally後(try-catch-finally外的語句塊)。
     3.在這4個位置都出現return的情況下(事實上應該是不可能的,如果前面3個位置都存在return,那麼最後一個位置的return就成了unreachable code,編譯不會通過),最終會執行的return應該是finally中的return。也就是finally中的return會覆蓋掉其它位置的return。