Java 当抛出异常时会发生什么?

Java 当抛出异常时会发生什么?,java,exception,try-catch,Java,Exception,Try Catch,我无法理解抛出异常时会发生什么 抛出的异常会发生什么情况?如何处理它以确保程序不会崩溃 例如,在本例中,如何处理抛出的算术异常 static int remainder(int dividend, int divisor) throws DivideByZeroException { try { return dividend % divisor; } catch (ArithmeticException e) { throw ne

我无法理解抛出异常时会发生什么

抛出的异常会发生什么情况?如何处理它以确保程序不会崩溃

例如,在本例中,如何处理抛出的
算术异常

static int remainder(int dividend, int divisor)
    throws DivideByZeroException {
    try {
        return dividend % divisor;
    }
    catch (ArithmeticException e) {
        throw new DivideByZeroException();
    }
}

您链接到的教程强调了Java中存在的异常类型的一个重要区别,即是否检查了异常

选中的异常要求作为开发人员的您要么捕获它(即处理它),要么声明将其抛出并向上游处理。我们的期望是您可以从这些类型的异常中恢复

未选中的异常是指在应用程序的自然执行过程中可能会或可能不会出现的异常,并且可能不会为应用程序的恢复引入自然方式。捕捉它们通常是不受欢迎的,因为这通常表明设计不佳(您允许零进入除法运算,这是非法的论点!)

在这种情况下,由于方法
remiter
声明它正在抛出一个
DivideByZeroException
,因此它的所有上游调用方必须通过以下方式处理其异常:

public static void main(String[] args) {
    try {
        NitPickyMath.remainder(1, 0);
    } catch (DivideByZeroException e) {
        e.printStackTrace();
    }
}
…或通过:

public static void main(String[] args) throws DivideByZeroException {
   NitPickyMath.remainder(1, 0);
}
后一种形式需要注意的是,没有任何东西会处理异常,它会导致应用程序崩溃


…如何处理抛出的
算术异常

static int remainder(int dividend, int divisor)
    throws DivideByZeroException {
    try {
        return dividend % divisor;
    }
    catch (ArithmeticException e) {
        throw new DivideByZeroException();
    }
}

您已经在处理它,方法是将它放在
catch
块中。您只需抛出一个选中的异常,以处理将1除以0所产生的实际错误。

感谢您的详细响应,非常感谢。所以,基本上,“处理”异常的唯一方法是确保它在catch块的某个地方被捕获?即使它被捕获,也不意味着在打印堆栈跟踪后应用程序仍将崩溃?@rni902:…或者将其声明为在方法签名中抛出。这是处理已检查异常的唯一两种方法。(如果您不这样做,编译器消息会说几乎相同的事情。)至于堆栈跟踪打印后崩溃:如果您没有捕获任何内容,那么它将崩溃;如果你只是在它被捕获后才打印堆栈跟踪,它就不会崩溃。谢谢,我想我想问的是,当它被捕获时会发生什么?例如“引擎盖下”这是我不明白的。。。