程序在執行時,如果異常沒有處理,程序就會被迫終止,異常處理能使程序可以處理預期之外的結果,使程序能順利運行。
異常可大致分爲三種:系統錯誤、異常、運行時異常。
系統錯誤用Error類表示,Error描述的是內部系統錯誤,而這種錯誤一般很少發生,但一旦發生,除了通知用戶以及儘量委穩妥的關閉程序外,基本沒什麼能做的;
異常用Exception類表示,Exception描述的是有程序和外部環境所引起的錯誤,這些異常能被捕獲和處理,例如引用一個不存在的類,打開一個不存在的文件等;
運行時異常用RuntimeException,RuntimeException描述的是程序的設計錯誤,例如除數爲0,數據類型錯誤,數組越界等。
處理異常通常有三個操作:聲明(由throws引導),拋出(由throw引導),捕獲(由catch引導)一個異常。
聲明異常:每個方法都必須聲明他可能拋出的必撿異常的類型,這稱爲聲明異常,每個方法都可能發生異常,但免檢異常是不需要聲明的,而必檢則必須在方法頭聲明
eg:
public void Method() throw Exception1,Exception2,Exception3....,ExceptionN;
拋出異常:檢測到錯誤的程序的可以創建一個合適的異常類型的實例並拋出它,這就稱爲拋出一個異常
eg:
throw new ArithmeticException("Wrong Argument"):
捕獲異常:在拋出一個異常後,我們可以用try-catch語句捕獲和處理它,在try語句中每拋出一個異常,程序就會跳過try中後面的語句,然後開始查找處理這個異常的代碼的過程,這個過程稱爲異常處理器;找到一個異常後直接查找處理異常的方法,從第一個catch查到最後一個catch,查到就執行,若沒有catch能捕獲這個異常,程序將停止。
eg;
try{
statements;
}
catch(Exception1 ex1){
handler for exception1;
}
catch(Exception2 ex2){
handler for exception2;
}
......
catch(ExceptionN exN){
handler for exceptionN;
}
一個通用的異常可以派生出各種異常類,如果一個異常能被父類catch捕獲,那他就能被他的子類catch捕獲,故catch塊中捕獲異常是有順序的,如果父類的catch塊是放在子類catch塊前面的,將出現編譯錯誤。
從JDK7開始能使用新的多捕獲特徵來簡化代碼,eg:
catch(Exception1 | EXception2 | Exception3 ......| ExceptionN){
}
在java.lang.Throwable類中提供了一些方法能顯示異常的信息,eg:
getMessage():放回描述給異常對象的信息,例如如果除數爲0,則返回/ by zero
toString():返回三個字符串的鏈接:異常類的全名 + ": " + getMessage()方法
printStackTrace():在控制檯上打印Throwable對象和它的調用堆棧(內存,即c語言中地址)信息