Java編程語言提供幾種預定義的異常。下面是可能遇到的更具共同性的異常中的幾種:
ArithmeticException:整數被0除,運算得出的結果。
int i = 12 / 0;
NullPointerException:當對象沒被實例化時,訪問對象的屬性或方法的嘗試:
Date d = null;
System.out.println(d.toString());
NegativeArraySizeException:創建帶負維數大小的數組的嘗試。
ArrayIndexoutofBoundsException:訪問超過數組大小范圍的一個元素的嘗試。
SecurityException:典型地被拋出到瀏覽器中,SecurityManager類將拋出applets的一個異常,該異常企圖做下述工作(除非明顯地得到允許):
訪問一個本地文件
打開主機的一個socket,這個主機與服務於applet的主機不是同一個。
在運行時環境中執行另一個程序
異常的處理機制
一般來說,異常的處理機制有以下三種:
try-catch-finally 主動異常處理
throws 消極異常處理
throw 引入異常
實例分析
例1
問題的描述:
寫一個常見的異常
解決方案:
請看下例:
[java]
public class TestException {
public static void main(String args[]) {
int i = 0;
String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };
for (; i < 6; i++) {
System.out.println(ss[i]);
}
}
}
public class TestException {
public static void main(String args[]) {
int i = 0;
String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };
for (; i < 6; i++) {
System.out.println(ss[i]);
}
}
}
運行的結果為如圖。
要處理異常,將能夠拋出異常的代碼放入try塊中,然後創建相應的catch塊的列表,每個可能被拋出異常都有一個。如果生成的異常與catch中提到的相匹配,那麼catch條件的塊語句就被執行。在try塊之後,可能有許多catch塊,每一個都處理不同的異常。
請看下例:
[java]
class TestException2 {
public static void main(String args[]) {
int i = 0;
String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };
for (; i < 5; i++) {
try {
System.out.println("第" + (i + 1) + "次循環:");
System.out.println(ss[i]);
} catch (Exception e) {
System.out.println("數組越界");
} finally {
System.out.println("finally execute");
}
}
}
}
class TestException2 {
public static void main(String args[]) {
int i = 0;
String ss[] = { "Hello world!", "您好,世界!", "HELLO WORLD!!" };
for (; i < 5; i++) {
try {
System.out.println("第" + (i + 1) + "次循環:");
System.out.println(ss[i]);
} catch (Exception e) {
System.out.println("數組越界");
} finally {
System.out.println("finally execute");
}
}
}
}
運行的結果如圖
總結:從上例可以看出:不管出現不出現異常,finally語句塊都會執行。在try語句塊裡除瞭System.exit(int)語句外,finally語句塊必須執行。
Throws則是自己不處理異常,而交給上級處理,俗稱“異常上拋”,比如:
public static void main(String args) throws RuntimeException
這樣,一旦在代碼裡出現RuntimeException,在本類裡不做任何處理動作,而是交由上次程序或者虛擬機去處理。
摘自 qq1712088151