所以基本上,如果我们在方法签名中使用
throws
关键字,我们会将处理责任传递给调用者方法;如果我们使用 throw
关键字,我们就会显式抛出异常。 throws
和 throw
都不是处理异常的方法。只有 catch
块中的语句才可以被视为处理异常的方法,因为我们的程序不会因为我们处理了异常而终止。我理解正确吗?因为在 Java 面试中我们总是被问到如何处理 Java 中的异常。
是的,我同意,大部分同意。
这是正确的。
当抛出异常时,你只有两个选择 - 要么
catch
要么允许它向上抛出给调用者。最终,如果它从未被捕获,线程将终止。
尝试捕捉
,这个列表更多的是关于 JVM 机制,而不是“框架”。 如果您想要更多,我相信您可以使用下面的代码并查看所使用的方法和类的文档。
public static void main(String[] args) throws InterruptedException {
System.out.println("START main");
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
System.err.println("Thread.setDefaultUncaughtExceptionHandler");
});
Thread.currentThread().setUncaughtExceptionHandler((t, e) -> {
System.err.println("thread[main].uncaughtException");
});
java.util.concurrent.ThreadFactory threadFactory = r -> {
ThreadGroup g = new ThreadGroup("eta") {
@Override
public void uncaughtException(Thread t, Throwable e) {
System.err.println("threadGroup.uncaughtException");
}
};
Thread thread = new Thread(g, r);
thread.setUncaughtExceptionHandler((t, e) -> {
System.err.println("thread.uncaughtException");
});
return thread;
// return new Thread(r);
};
threadFactory.newThread(() -> {
System.out.println("START newThread logic");
throw new RuntimeException();
}).start();
if (true) throw new RuntimeException();
}
输出:
START main
START newThread logic
thread[main].uncaughtException
thread.uncaughtException