自定义的RuntimeException没有捕获java.lang.ArrayIndexOutOfBoundsException

时间:2015-07-15 20:29:27

标签: java exception-handling runtimeexception

任何人都可以告诉为什么catch close正在躲避(没有捕获)ArrayIndexOutOfBoundsException? catch块仅适用于没有自定义的Exception。

class MyException extends RuntimeException {

    public MyException(String msg) {

        super(msg);
        System.out.println("caught in MyException2 constructor");
    }
}

public class CustomizedExceptionTester {

        public static void main(String[] args) {
            try {
                doTest();
            } catch (MyException me) {

                System.out.println("caught in catch block");

                System.out.println(me);
            }
        }

        static void doTest() throws MyException {
            int[] array = new int[10];
            array[10] = 1000;
        }
    }

打印:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at oca.exceptions.InterfaceWithException.doTest(InterfaceWithException.java:32)
    at oca.exceptions.InterfaceWithException.main(InterfaceWithException.java:17)

2 个答案:

答案 0 :(得分:2)

你为什么期望它?你在catch区有MyException;它只会捕获该类型的异常。即使MyExceptionArrayIndexOutOfBoundsException都扩展RuntimeException,但并不意味着在指定所有子类RuntimeException >任何子类;只捕获指定的类型。

这样想。假设我有“四边形”,“矩形”和“菱形”。如果我说“抓住任何我扔你的长方形”,你会抓到一个菱形吗?但是,如果我说“抓住任何四边形状,我就会抛弃你”,无论如何你都会抓住它们。

答案 1 :(得分:2)

你是说doTest()可以抛出MyException,无论是否可以。尝试访问超出范围的数组索引不会抛出MyException,它会抛出ArrayIndexOutOfBoundsException。 Java不会捕获未被抛出的异常。如果您希望运行自定义异常代码,则需要显式抛出它。

try {
    array[10] = 1000;
} catch (ArrayIndexOutOfBoundsException e) {
    throw new MyException(e.getMessage());
}

这种情况并没有真正受益于此,因此您可以将您的exeption代码移动到catch块内部或将其提取到单独的方法。