Java異常處理錯誤
發現錯誤的最佳時期是在編譯階段,也就是在你運行程序之前。然而,編譯期間並不能找出所有的錯誤,餘下的問題必須在運行階段解決。這就需要錯誤源通過某種方式把適當的信息傳給某個接收者,該接收者知道如何處理這個問題。
Java中的異常處理的目的在於通過使用少於目前數量的代碼來簡化大型,可靠的程序的生成,並且通過這種方式可以使你更加自信:你的應用中沒有未處理的錯誤。
異常這個詞有我對此感到意外的意思。問題出現了,你也許不清楚該如何處理,但你的確知道不該置之不理;你要停下來,看看是不是有別人是不是在別的地方,能夠處理這個問題。只是在當前的環境中還沒有足夠的信息來解決這個問題,所以把問題提交到更高級別的環境中,在這裏將作出正確地決定。
使用異常所帶來的另一個相當明顯的好處是:它往往能夠降低錯誤處理代碼的複雜度。如果不使用異常,那麼就必須檢查特定的錯誤,並在程序的許多地方去處理它。而如果使用異常,就不必在方法調用處進行檢查,因爲異常機制將能保證捕獲這個錯誤。並且,只需在一個地方處理錯誤,即所謂的異常處理程序中。這種方式不僅節省代碼,而且把“描述在正常執行過程中做什麼事”的代碼和“出了問題怎麼辦”的代碼相分離。
異常處理的過程:
當拋出異常之後,有幾件事情會隨之發生。首先,同Java中其他對象的創建一樣,將使用new在堆上創建異常對象。然後,當前的執行路徑被終止,並且從當前環境中彈出對異常對象的引用。此時,異常處理機制接管程序,並開始尋找一個恰當的地方來繼續執行程序。這個恰當的地方就是異常處理程序,它的任務是將程序從錯誤狀態中恢復,以使程序能要麼換一種方式運行,要麼繼續運行下去。
import java.util.*;
public class WhoCalled{
static void f(){
try{
throw new Exception();
}catch(Exception e){
for(StackTraceElement s:e.getStackTrace())
System.out.println(s.getMethodName());
}
}
static void g(){
f();
}
static void h(){
g();
}
public static void main(String[] args){
f();
System.out.println("--------------------------------------");
g();
System.out.println("--------------------------------------");
h();
}
}
finally子句:
無論異常是否拋出,finally子句總能被執行。
import java.util.*;
class ThreeException extends Exception{}
public class FinallyWorks{
static int count=0;
public static void main(String[] args){
while(true){
try{
if(count++==0)
throw new ThreeException();
System.out.println("No exception");
}catch(ThreeException e){
System.out.println("ThreeException");
}finally{
System.out.println("In finally clause");
if(count==2)
break;
}
}
}
}