-1

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

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

2 回答 2

4

IllegalArgumentException 是一个未经检查的异常,所以如果你没有在程序中的某个地方捕获它,它会一直上升,直到它到达 VM,然后执行停止。

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

于 2012-11-01T20:01:20.470 回答
1

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

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

于 2012-11-01T20:01:04.290 回答