Exception和RuntimeException之間的主要區別是我們需要在try/catch塊中包裝一個Exception。 RuntimeException不需要被捕獲,但它與Exception一樣致命。
public class Main{
public static void main(String[] args) {
Thread.currentThread().setUncaughtExceptionHandler(
new Thread.UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Throwable e){
System.out.println("Uncaught Exception " + e);
}
});
try{
throwException();
}catch(Exception e){
System.out.println("Caught Exception " + e);
}
try{
throwRuntimeException();
}catch(Exception e){
System.out.println("Caught RuntimeException " + e);
}
//unchecked, no need to wrap int try/catch
throwRuntimeException();
}
public static void throwException() throws Exception {
throw new Exception();
}
public static void throwRuntimeException() {
throw new RuntimeException();
}
}
以上面的示例爲例。輸出是這樣的:
捕獲的異常java.lang.Exception的
抓到的RuntimeException了java.lang.RuntimeException
未捕獲的異常了java.lang.RuntimeException
正如你所知道的,通話throwRuntimeException()被拋出,並且由於沒有try/catch塊,所以它不知道如何處理它。這使線程崩潰,並且因爲有一個UncaughtExceptionHandler被調用。
然後還有一個錯誤,我不會去,因爲除了JVM拋出它之外,我對它不瞭解太多。 OutOfMemoryError就是一個例子。
它擴展了Exception,而不是RuntimeException。 – WalterM
謝謝!這是什麼意思,拋出子句作爲\t以及catch塊? – Abc
必須由調用者處理異常。要麼重新拋出異常,要麼抓住它。運行時異常不需要直接處理 –