故意抛出ArrayIndexOutOfBoundsException却出现两个异常是否正常?
问题解答
这是正常现象,核心原因是你的代码里触发了两次异常抛出:
- 第一次自动抛出异常:你在try块里执行
System.out.println(numbers[10]);,而数组numbers的长度是5,有效索引范围是0到4。访问索引10时,JVM会自动抛出ArrayIndexOutOfBoundsException,这是Java内置的数组越界异常触发逻辑。 - 第二次手动抛出异常:finally块的执行规则是无论try块是否抛出异常,都会执行其中的代码。所以当try块抛出异常后,程序会进入finally块调用
demo()方法,而这个方法里你手动实例化并抛出了另一个ArrayIndexOutOfBoundsException。
当finally块也抛出异常时,try块中原来的异常会被压制,最终程序会以finally块的异常作为最终抛出的异常,但Java会把被压制的异常信息也一并打印出来,所以你会看到两个异常的错误信息。
如果你想只测试手动抛出异常的逻辑,可以调整代码,去掉try块中自动触发异常的代码,比如:
public class ArrayIndexOutOfBoundsExceptionThrown { static void demo() { System.out.println("Asked for index 10"); throw new ArrayIndexOutOfBoundsException("Invalid array index!"); } // end of demo public static void main(String[] args) { try { demo(); } finally { System.out.println("finally 块执行完毕"); } }// end of main } // end of ArrayIOOBE
这样运行后,就只会出现你手动抛出的那一个异常了。
内容的提问来源于stack exchange,提问作者zafflesia
相关产品推荐
相关产品推荐

