異常處理是個很重要的概念,很多語言中都對異常處理下了很大的功夫。如果你的語法沒有寫錯,編譯器是不會報錯,而且編譯成功。如果編譯成功后,運行時發生了錯誤該怎么處理呢?例如我要加載一個類,而這個類被刪了。這種情況就是異常。我們采用try..catch..finally語句作為處理方式。舉個異常處理的例子吧。實踐:
public class TestExceptions {
public static void main(String[] args) {
for ( int i = 0; true; i++ ) {
System.out.println("args[" + i + "] is '" + args[i] + "'");
} }}
在這里面main方法的參數args是個字符串型的數組,在執行的時候要輸入
java TestExceptions 100jq 后面的就是參數args[0]就是第一個參數。我們輸入java TestException是出現了錯誤。如圖20-1所示,
這上說的是數組邊界溢出異常,第0個產生錯誤,因為根本就沒有args[0],這個元素。
我們再敲一下java TestExceptions 100jq 如圖20-1所示,
輸出了args[0]沒有異常了,并且輸出了。而循環到i=1時,又發生異常。我們再輸入兩個參數java TestExceptions 100jq www.100jq.com 這回兩個參數了。同樣的道理,args[2]發生異常。
那么我們如何來捕捉這個異常呢,我們對上述代碼做一下簡單的修改。實踐:
public class TestExceptions1 {
public static void main(String[] args) {
try {
for ( int i = 0; true; i++ ) {
System.out.println("args[" + i + "] is '" + args[i] + "'");
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("異常捕捉: " + e);
System.out.println("退出...");
} }} 這回輸入剛才那兩個參數的話,就不會出現那一堆難懂的英文了。異常已經在我們的掌控之中。否則,有很多異常是足夠使內存導毀的。
這里面我們只使用了try…catch 哪個地方你覺得它有毛病,你就try哪。但是try然后,要catch(捕捉)的。如果事先你想不出它會發生什么異常的話,就用finally。實踐:
class FinallyDemo {
static void procA() {
try {
System.out.println("inside procA");
throw new RuntimeException("demo");
} finally {
System.out.println("procA's finally");
}
}
// 從try程序塊內返回
static void procB() {
try {
System.out.println("inside procB");
return;
} finally { //結束
System.out.println("procB's finally");
}
}
// 執行一個try程序塊
static void procC() {
try {
System.out.println("inside procC");
} finally {
System.out.println("procC's finally");
}
}
public static void main(String args[]) {
try {
procA();
} catch (Exception e) {
System.out.println("異常捕捉");
}
procB();
procC();
}
} 上述源碼打包下載
如果將方法里拋出異常拋出,使用throws關鍵字 public void abc() throws exception 也是要用catch來捕捉的。實踐:
class ThrowDemo {
static void demoproc() {
try {
throw new NullPointerException("demo");
} catch(NullPointerException e) {
System.out.println("Caught inside demoproc.");
throw e; //重新拋出異常 }}
public static void main(String args[]) {
try {
demoproc();
} catch(NullPointerException e) {
System.out.println("Recaught: " + e);
}}} 19個源碼打包下載
異常類除了jdk提供我們的那些之外,我們自己還可以自定義的。Jdk提供的剛才我們已經見過幾個了 ArrayIndexOutOfBoundsException(數組邊界溢出),NullPointerException(空指針異常)。要是jdk沒有的,我們只有自己定義了。比如說我們現在要用XML開發,那么jdk沒有寫這方面的異常類,我們就得自己寫一個關于XML的異常了。我們下節課講自定義異常類。