Java 异常在哪里捕获?

Java 异常在哪里捕获?,java,exception-handling,Java,Exception Handling,我正在读一个朋友的课堂笔记,我想知道下面代码的注释中的问题的答案是什么 public void withdraw(double amount) { if (amount > balance) { IllegalArgumentException exception1 = new IllegalArgumentException("Amount exceeds balance"); throw exception1; //

我正在读一个朋友的课堂笔记,我想知道下面代码的注释中的问题的答案是什么

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

如果不在方法内部处理,则从方法引发的异常将委托给调用它的方法。最后,它将方法调用层次结构移动到主线程堆栈的底部,即
main
方法。现在,如果main方法不处理异常,那么它将到达
JVM
,这将停止主线程,并将发生的异常显示为完整堆栈跟踪


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

IllegalArgumentException是一个未检查的异常,因此如果您在程序中的某个地方没有捕获它,它将一直上升,直到到达VM,执行停止


值得称赞的是@JBNizet:当从非主线程的线程调用方法时,当抛出异常时,该线程将停止。但是主线程将继续执行。

如果看不到代码对该方法的调用,就无法确定。它可能永远不会被捕获-它可能会一直传播到主方法并导致程序退出。在
draw
方法的调用方中?@Nambari IllegalArgumentException被取消选中。
尝试{draw(amount);}catch(IllegalArgumentException ex){//do stuff with exception}
除非代码是从非主线程的线程调用的,否则在这种情况下,线程将简单地停止。@jbnitet。没错。这里没有考虑多线程的情况。但这一点是正确的