【问题标题】:What happens when an exception is thrown?抛出异常时会发生什么?
【发布时间】:2015-10-26 17:26:03
【问题描述】:

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

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

例如,在这个来自this tutorial 的示例中,如何处理抛出的ArithmeticException

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

【问题讨论】:

    标签: java exception try-catch


    【解决方案1】:

    您链接到的教程强调了 Java 中有哪些类型的异常的重要区别,即异常是 checked 还是 unchecked

    已检查异常是要求您作为开发人员要么捕获它(即处理它),要么声明它被抛出并在上游处理。期望您可以从这些异常中恢复。

    未经检查的异常是在应用程序自然执行期间可能会或可能不会突然出现的异常,并且可能不会为应用程序引入自然恢复方式。抓住它们通常是不受欢迎的,因为它通常表示设计不佳(您允许零进入除法运算,这是非法的论点!)。

    在这种情况下,因为方法 remainder 声明它正在抛出 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);
    }
    

    对后一种形式的警告是 nothing 将处理异常,它会导致应用程序崩溃。


    ...如何处理抛出的ArithmeticException

    您已经正在通过将它放在catch 块中来处理它。您只是重新抛出一个检查异常来处理将 1 除为 0 导致的实际错误。

    【讨论】:

    • 感谢您的详细回复,不胜感激。所以基本上“处理”异常的唯一方法是确保它在catch块中的某个地方被捕获?就算被抓到了,是不是说打印了堆栈跟踪后应用还是会崩溃?
    • @rni902: ...或者将其声明为在方法签名中抛出。这些是处理已检查异常的仅有的两种方法。 (如果你不这样做,编译器消息会说差不多同样的事情。)至于它在堆栈跟踪打印后崩溃:如果你抓住任何东西然后是的它会崩溃;如果你只打印堆栈跟踪它被捕获后,它还没有崩溃。
    • 谢谢,我想我想问的是,当它被抓住时会发生什么? IE。 “引擎盖下”这就是我不明白的......
    猜你喜欢
    • 2010-12-12
    • 2014-01-19
    • 2011-02-24
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    相关资源
    最近更新 更多