You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java throws关键字异常处理问题:为何仅捕获到算术异常?

问题分析与解决方案

咱们先直接点出你代码里的核心问题:ArithmeticException先被触发了,导致Xyz.test()方法根本没机会执行,所以你期望的NumberFormatException对应的提示永远不会输出。

为什么会出现这种情况?

你的D.add()方法里的执行顺序是硬逻辑:

  1. 先执行System.out.println(a / 0);,这行代码会立刻抛出ArithmeticException(除以0)
  2. 只有当这行代码完全正常执行完,才会走到Xyz.test();这一步去触发NumberFormatException

但因为第一步就抛出了异常,方法会直接终止运行,后续的代码完全不会被执行,所以NumberFormatException根本没机会被抛出,自然对应的catch块也不会触发。

怎么修改才能看到你期望的两个输出?

如果你想测试两个异常的捕获逻辑,需要调整代码的执行逻辑,让两个异常有各自的触发路径,比如:

方案1:调整执行顺序,先触发NumberFormatException

修改D.add()方法,把Xyz.test()放到除法代码前面:

class D { 
    void add() throws ArithmeticException,NumberFormatException { 
        Xyz.test(); // 先触发NumberFormatException
        int a = 9; 
        System.out.println(a / 0); 
    } 
}

这样运行时会先抛出NumberFormatException,触发对应的提示;如果你注释掉Xyz.test()这行,就会触发除法异常,输出另一条提示。

方案2:做分支控制,分别测试两个异常

通过参数控制方法执行逻辑,这样可以在一次运行中同时测试两种异常场景:

class D { 
    void add(boolean triggerParseError) throws ArithmeticException,NumberFormatException { 
        if(triggerParseError) {
            Xyz.test(); // 触发NumberFormatException
        } else {
            int a = 9; 
            System.out.println(a / 0); // 触发ArithmeticException
        }
    } 
}

class Abc { 
    public static void main(String args[]) { 
        // 测试NumberFormatException场景
        try{ 
            D d = new D(); 
            d.add(true); 
        } catch(NumberFormatException ex) { 
            System.out.println("Improper Input to parse method!"); 
        } catch(ArithmeticException ex) { 
            System.out.println("Divide by 0 Error!"); 
        } 

        // 测试ArithmeticException场景
        try{ 
            D d = new D(); 
            d.add(false); 
        } catch(NumberFormatException ex) { 
            System.out.println("Improper Input to parse method!"); 
        } catch(ArithmeticException ex) { 
            System.out.println("Divide by 0 Error!"); 
        } 
    } 
}

运行这段代码,就能看到你期望的两条提示了。

额外小提醒

在Java里,当方法抛出异常时,异常抛出点之后的所有代码都会停止执行,所以如果想让多个异常都有机会被触发,必须保证它们处于不同的执行分支或者独立的调用场景中。

内容的提问来源于stack exchange,提问作者Akshit Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:54:52