一.java的異常,只要catch住異常了,程式就不會掛,依然會執行catch之後的語句
Java程式發生異常就掛了嗎?
為了驗證程式不會掛,我寫了個例子給大家看看。
測試程式碼:
import java.io.File;
import java.io.IOException;
/**
* Java程式發生異常就掛了嗎?
*
*/
publicclass TestException {
publicstaticvoid main(String[] args) {
TestException te = new TestException();
String s = te.test();
System.out.println(s);
}
/**
* 這個方法有異常,看看異常發生時候會不會執行到底,會不會返回個值?
*
* @return 一個字串!
*/
public String test() {
System.out.println(">>>> start");
try {
test1();
File f = null;
f.delete();
// int x = 10;
// int y = 0;
// int z = x / y;
System.out.println("計算完成了!");
} catch (Exception e) {
System.out.println("出異常掛了我如何處理呢?");
System.out.println(e);
} finally {
System.out.println("最後總要做的一件事。。。");
}
System.out.println(">>>> end");
return"good!";
}
/**
* 拋個比較猛烈的異常看看程式會掛嗎?
*
* @throws IOException
*/
publicvoid test1() throws IOException {
thrownew IOException();
}
}
執行結果:
>>>> start
出異常掛了我如何處理呢?
java.io.IOException
最後總要做的一件事。。。
>>>> end
good!
Process finished with exit code 0
換個異常執行看看:
>>>> start
出異常掛了我如何處理呢?
java.lang.NullPointerException
最後總要做的一件事。。。
>>>> end
good!
Process finished with exit code 0
再換個控制針看看:
>>>> start
出異常掛了我如何處理呢?
java.lang.ArithmeticException: / by zero
最後總要做的一件事。。。
>>>> end
good!
Process finished with exit code 0
結果表明:程式僅僅跳過了try中發生異常以後的程式碼,在發生異常時候執行了處理語句塊catch,在catch執行結束後接著執行了finally語句塊,然後繼續執行try...catch...finally之外的語句塊。
---------------------
作者:zcywell
來源:CSDN
原文:https://blog.csdn.net/zcywell/article/details/7452952
版權宣告:本文為博主原創文章,轉載請附上博文連結!
二.spring web的異常
無論程式怎麼拋,在mvc controller中哪怕沒有catch異常,你會發現web程式依然沒有掛掉,那必然是有個地方做了catch住,否則程式會掛掉的。這就是spring mvc必然做了統一的異常攔截。
Java中的異常在什麼時候由JVM處理
大哥異常能處理就處理 ,能處理 就 轉換成RuntimeExcepiton異常 供上層處理也可以讓jvm處理。 簡單來說,當在N層方法呼叫中,歸根到底,最終都是由主類的主方法(即Main方法)去呼叫的,亦稱之為入口方法,當產生的異常在所有方法中都未處理時,最終會交給JVM處理,處理結果就是終止程式執行,並丟擲異常資訊。
一般在設計中,如果想該程式碼產生異常而方便查錯時,會保留該異常不處理,或向上一層丟擲該異常,其他情況都會Try Catch去處理。
例項
下面的例子中宣告有兩個元素的一個數組,當代碼試圖訪問陣列的第三個元素的時候就會丟擲一個異常。
ExcepTest.java 檔案程式碼:
以上程式碼編譯執行輸出結果如下:
Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3
Out of the block
多重捕獲塊
一個 try 程式碼塊後面跟隨多個 catch 程式碼塊的情況就叫多重捕獲。
多重捕獲塊的語法如下所示:
上面的程式碼段包含了 3 個 catch塊。
可以在 try 語句後面新增任意數量的 catch 塊。
如果保護程式碼中發生異常,異常被拋給第一個 catch 塊。
如果丟擲異常的資料型別與 ExceptionType1 匹配,它在這裡就會被捕獲。
如果不匹配,它會被傳遞給第二個 catch 塊。
如此,直到異常被捕獲或者通過所有的 catch 塊。
例項
該例項展示了怎麼使用多重 try/catch。
throws/throw 關鍵字:
如果一個方法沒有捕獲到一個檢查性異常,那麼該方法必須使用 throws 關鍵字來宣告。throws 關鍵字放在方法簽名的尾部。
也可以使用 throw 關鍵字丟擲一個異常,無論它是新例項化的還是剛捕獲到的。
下面方法的宣告丟擲一個 RemoteException 異常:
一個方法可以宣告丟擲多個異常,多個異常之間用逗號隔開。
例如,下面的方法宣告丟擲 RemoteException 和 InsufficientFundsException:
finally關鍵字
finally 關鍵字用來建立在 try 程式碼塊後面執行的程式碼塊。
無論是否發生異常,finally 程式碼塊中的程式碼總會被執行。
在 finally 程式碼塊中,可以執行清理型別等收尾善後性質的語句。
finally 程式碼塊出現在 catch 程式碼塊最後,語法如下:
宣告自定義異常
在 Java 中你可以自定義異常。編寫自己的異常類時需要記住下面的幾點。
- 所有異常都必須是 Throwable 的子類。
- 如果希望寫一個檢查性異常類,則需要繼承 Exception 類。
- 如果你想寫一個執行時異常類,那麼需要繼承 RuntimeException 類。
可以像下面這樣定義自己的異常類:
只繼承Exception 類來建立的異常類是檢查性異常類。
下面的 InsufficientFundsException 類是使用者定義的異常類,它繼承自 Exception。
一個異常類和其它任何類一樣,包含有變數和方法。
例項
以下例項是一個銀行賬戶的模擬,通過銀行卡的號碼完成識別,可以進行存錢和取錢的操作。
InsufficientFundsException.java 檔案程式碼:
為了展示如何使用我們自定義的異常類,
在下面的 CheckingAccount 類中包含一個 withdraw() 方法丟擲一個 InsufficientFundsException 異常。
CheckingAccount.java 檔案程式碼:
下面的 BankDemo 程式示範瞭如何呼叫 CheckingAccount 類的 deposit() 和 withdraw() 方法。
BankDemo.java 檔案程式碼:
編譯上面三個檔案,並執行程式 BankDemo,得到結果如下所示:
Depositing $500... Withdrawing $100... Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException
at CheckingAccount.withdraw(CheckingAccount.java:25)
at BankDemo.main(BankDemo.java:13)