Java throws关键字异常处理问题:为何仅捕获到算术异常?
问题分析与解决方案
咱们先直接点出你代码里的核心问题:ArithmeticException先被触发了,导致Xyz.test()方法根本没机会执行,所以你期望的NumberFormatException对应的提示永远不会输出。
为什么会出现这种情况?
你的D.add()方法里的执行顺序是硬逻辑:
- 先执行
System.out.println(a / 0);,这行代码会立刻抛出ArithmeticException(除以0) - 只有当这行代码完全正常执行完,才会走到
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
相关产品推荐
相关产品推荐

