我正在上课阅读朋友的笔记,我想知道以下代码的评论中问题的答案是什么?
public void withdraw(double amount) {
if (amount > balance) {
IllegalArgumentException exception1 = new IllegalArgumentException("Amount exceeds balance");
throw exception1; //where caught??
}
balance = balance - amount;
}
答案 0 :(得分:4)
IllegalArgumentException是一个未经检查的异常,因此如果你没有在程序中的某个地方捕获它,它将一直向上移动直到它到达VM,并且执行停止。
归功于@JBNizet:当你从一个不是主线程的线程调用你的方法时,那个线程将在抛出异常时停止。但主线程将继续执行。
答案 1 :(得分:1)
如果不在方法中处理它,则从方法中抛出的异常将委托给调用它的方法。最后,它遍历方法调用层次结构,直到主线程堆栈的底部,这是您的main
方法。现在,如果main方法没有处理异常,那么它会到达JVM
,它会暂停你的主线程,并显示异常发生的完整堆栈跟踪。
正如@JBNizet在注释中指出的那样,如果你的方法是从一个不是main
线程的其他线程调用的,那么当异常到达run
方法时,该线程将停止。但主线程将继续执行。您可以猜测为什么,因为每个线程都有自己的stack
,因此主线程与发生异常的线程位于不同的stack
。