Основное отличие между Exception и RuntimeException заключается в том, что нам нужно обернуть исключение в блок try/catch. Исключение RuntimeException не нужно захватывать, но оно так же смертельно, как и исключение.
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();
}
}
Возьмите этот пример выше. Выход заключается в следующем:
Caught Исключение java.lang.Exception
Пойманный RuntimeException java.lang.RuntimeException
Uncaught Exception java.lang.RuntimeException
Как вы можете сказать, вызов throwRuntimeException() получает бросок, и поскольку нет блока try/catch, он не знает, как его обрабатывать. Это приводит к сбою потока, и поскольку он вызывает вызов UncaughtExceptionHandler.
Тогда есть также Ошибка, с которой я не буду вдаваться, поскольку я не знаю много об этом, кроме того, что JVM выбрасывает ее. Пример OutOfMemoryError.
Это исключает исключение, а не RuntimeException. – WalterM
Спасибо! Что это означает в отношении предложений бросков как \t так же, как блоки catch? – Abc
исключение должно обрабатываться вызывающим абонентом. либо путем реорганизации исключения, либо его улова.Исключения Runtime не нужно обрабатывать напрямую –