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
必须由调用者处理异常。要么重新抛出异常,要么抓住它。运行时异常不需要直接处理 –