第二節、異常處理實例分析
以下是Java中一個錯誤處理的例子:
[MultiCatch.Java] :
package Examples;
public class MultiCatch{
public static void main(String[] args){
try{
int a=args.length; //將字符串數組args的長度賦給int變量a
System.out.println("args的長度是 : "+a); // 打印a 的值
int b=36/a; //用a除36,當main方法無參數傳入時會出現被零除錯誤
System.out.println("args的第2個參數是: "+args[1]); //打印args第二個參數,
}catch(ArithmeticException e){
System.out.println("無參數傳入,args.length=0,出現錯誤 ");
System.out.println("Divide by 0: "+e);
}catch(ArrayIndexOutOfBoundsException e){
System.out.println("傳入參數少於2個,出現錯誤 ");
System.out.println("Array Index Out of Bounds: "+e);
}finally{
System.out.println("finally代碼塊:無論有無異常,這裏仍然會執行");
}
System.out.println(“程序沒有被終止!”);
}
}
下面是運行在三種不同情況下程序的輸出:
C:/javaApp>java Examples.MultiCatch
a = 0
無參數傳入,args.length=0,出現錯誤
Divide by 0: java.lang.ArithmeticException: / by zero
finally代碼塊:無論有無異常,這裏仍然會執行
程序沒有被終止!
C:/javaApp>java Examples.MultiCatch test01
a = 1
傳入參數少於2個,出現錯誤
Array Index Out of Bounds: java.lang.ArrayIndexOutOfBoundsException: 1
finally代碼塊:無論有無異常,這裏仍然會執行
程序沒有被終止!
C:/javaApp>java Examples.MultiCatch test01 test02
a = 2
args的第2個參數是: test02
finally代碼塊:無論有無異常,這裏仍然會執行
程序沒有被終止!
對比VB和Java中的異常處理,我們可以要發現Java中的異常處理機制非常靈活和方便,而且不會中止程序的運行。但要注意的是,如果程序中出現異常時,我們沒有爲我們的程序提供異常處理,或找不到匹配的異常處理程序,那麼異常最終會被Java運行時系統的默認處理程序捕獲並終止程序運行。默認處理程序顯示一個描述異常的字符串,打印異常發生處的堆棧軌跡並且終止程序。你可以嘗試將上面例子中的第二個catch塊去掉,那麼運行在只有一個參數的情況下會出現錯誤,而且try/catch/finally代碼塊後的語句: System.out.println(“程序沒有被終止!”); 將不會執行。
如果一個finally塊中出現或拋出(throw)了一個異常,那麼這個異常會代替前面try代碼塊任何正在被拋出過程中的異常。如果一個finally塊內使用一個return語句,那麼即使一個異常已經被拋出並且還沒有處理,這個方法也會正常返回。
下面是另外一個例子:
[ExceptionDemo.java]
package Examples;
import java.util.Random; //導入 Random類
public class ExceptionDemo{
public static void main(String[] args){
int a=0,b=0,c=0;
Random r=new Random(); //創建Random類的一個實例
for(int i=0;i<10;i++){
try{
b=r.nextInt(); //使用Random類實例的nextInt()方法來獲取一個隨機
c=r.nextInt(); // int 類型整數
a=12345/(b/c); //用 c除b,結果用來除12345,以增加被零除錯誤機會
}catch(ArithmeticException e){
// e.printStackTrace(); 這個語句被我註釋掉了,它的作用後面有講
System.out.println("Division by zero."); // 打印出錯誤,
a=0; //這裏設置a爲零
}
System.out.println(" a is : "+a);
}
}
}
編譯運行後的某次輸出如下(每次運行的結果都不相同):
a is : -2469
a is : -12345
a is : -6172
a is : -6172
a is : -1234
a is : 12345
Division by zero.
a is : 0
a is : -6172
a is : -12345
Division by zero.
a is : 0
上面程序中的“e.printStackTrace();”語句如果沒有註釋掉的話,那麼在每句“Division by zero.”前會輸出:
java.lang.ArithmeticException: / by zero
at Examples.ExceptionDemo.main(ExceptionDemo.java:11)
java.lang.ArithmeticException指明異常類型,後面的“/ by zero”是具體異常描述
Examples.ExceptionDemo.main指明異常在Examples包中的ExceptionDemo類main方法中
最後指明java文件名稱及出現錯誤代碼位置:ExceptionDemo.java 中的第11行。