1. Throwable的方法
String getMessage()
String getLocalizedMessage()
String toString()
void printStackTrace()
每個方法都比前一個提供更多的信息
2. 重新拋出異常
catch (Exception e) {
System.err.println(“An exception was thrown”);
throw e;
}
重拋異常會把異常拋給上一級環(huán)境中的異常處理程序,同一個try快的后續(xù)catch字句將被忽略。
由于只是把當前異常對象重新拋出,printStackTrace()方法顯示的將是原來的異常拋出點的調(diào)用棧信息,而非重新拋出點的信息。要想更新這個信息,把throw e;改成
throw e.fillInStackTrace();
3. 異常鏈
有時候你需要處理一個異常并拋出另一個,但仍要保持原異常的信息,這被成為異常鏈。
Throwable的三個基礎(chǔ)子類Error, Exception, RuntimeException都有一個接收cause參數(shù)的構(gòu)造器。如果想建立這三個子類以外的異常鏈,就得使用initCause()方法。
4. 標準Java異常
Throwable有兩個直接子類:Error類代表了系統(tǒng)運行期錯誤,通常情況不用捕獲;Exception類則是Java類庫、用戶的方法。通常要處理的是Exception。
當然,異常類中最重要的還是類名。
異常并非都在java.lang中,有些還在util, net, io等庫中。
5. RuntimeException
RuntimeException通常由Java自動拋出,如
if (reference == null) throw new NullPointerException();
是多余的。
如果一個RuntimeException被拋出后一直到main方法也未被處理,printTraceStack()方法被自動調(diào)用。
6. finally
沒有垃圾收集器或析構(gòu)函數(shù)自動調(diào)用的語言中,finally的重要性在于釋放內(nèi)存。而Java中finally則多用在使對象恢復到原來的狀態(tài),如打開的文件、網(wǎng)絡(luò)連接,在屏幕上的繪圖等。
7. 異常丟失
try {
lm.f();
} finally {
lm.dispose();
}
如果lm.f()和lm.dispose()都會拋出錯誤的話,f()中拋出的錯誤會被徹底丟失。C++中就不存在這個問題。
所以對于會拋出錯誤的方法,最好將他們放入每一個try-catch塊中。