捕获的例外在哪里?

时间:2012-11-01 19:59:12

标签: java exception-handling

我正在上课阅读朋友的笔记,我想知道以下代码的评论中问题的答案是什么?

public void withdraw(double amount) { 
        if (amount > balance) { 
            IllegalArgumentException exception1 = new IllegalArgumentException("Amount exceeds balance"); 
            throw exception1; //where caught?? 
        }
        balance = balance - amount;
    }

2 个答案:

答案 0 :(得分:4)

IllegalArgumentException是一个未经检查的异常,因此如果你没有在程序中的某个地方捕获它,它将一直向上移动直到它到达VM,并且执行停止。

归功于@JBNizet:当你从一个不是主线程的线程调用你的方法时,那个线程将在抛出异常时停止。但主线程将继续执行。

答案 1 :(得分:1)

如果不在方法中处理它,则从方法中抛出的异常将委托给调用它的方法。最后,它遍历方法调用层次结构,直到主线程堆栈的底部,这是您的main方法。现在,如果main方法没有处理异常,那么它会到达JVM,它会暂停你的主线程,并显示异常发生的完整堆栈跟踪。

正如@JBNizet在注释中指出的那样,如果你的方法是从一个不是main线程的其他线程调用的,那么当异常到达run方法时,该线程将停止。但主线程将继续执行。您可以猜测为什么,因为每个线程都有自己的stack,因此主线程与发生异常的线程位于不同的stack