自定义运行时异常未捕获java.lang.ArrayIndexOutOfBoundsException

自定义运行时异常未捕获java.lang.ArrayIndexOutOfBoundsException,java,exception-handling,runtimeexception,Java,Exception Handling,Runtimeexception,任何人都能知道为什么抓球的人都在躲闪,而不是抓球?catch块仅在没有自定义异常的情况下工作 class MyException extends RuntimeException { public MyException(String msg) { super(msg); System.out.println("caught in MyException2 constructor"); } } public class CustomizedE

任何人都能知道为什么抓球的人都在躲闪,而不是抓球?catch块仅在没有自定义异常的情况下工作

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)

为什么你会期望它呢?你在catch块中有MyException;它将只捕获该类型的异常。即使MyException和ArrayIndexOutOfBoundsException都扩展了RuntimeException,但这并不意味着在指定任何子类时都应该捕获RuntimeException的所有子类;将仅捕获指定的类型

这样想吧。假设我有四边形、长方形和菱形。如果我说抓住我扔给你的任何矩形,你会抓住一个菱形吗?但如果我说抓住我扔给你的任何一个四边形,你无论如何都会抓住它们。

你是说doTest可以抛出我的异常,不管它是否抛出,这都是好的。尝试访问超出边界的数组索引不会引发MyException,而是引发ArrayIndexOutOfBoundsException。Java不会捕获未被抛出的异常。如果希望自定义异常代码运行,则需要显式抛出它

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

这种情况实际上不会从中受益,因此您可以将您的验证代码移动到catch块内部,或将其提取到单独的方法。

原因可能是runtimeException是一个未检查的验证,runtimeException应该终止线程而不被捕获。运行时异常可以被捕获。这里的问题是您正在指定RuntimeException的一个子类。这并不意味着RuntimeException的每个子类都会被捕获,只会捕获指定的类型。这正是我们想要知道的。谢谢,酷!我取消删除了我的答案——我已经详细说明了它本质上是我评论的一个扩展版本。我不希望这段代码以这种方式处理异常。这是一个OCA 1Z0 803棘手的问题。只是准备。非常感谢你的回复。非常感谢。我设想RuntimeException使用switch{case:}方法来优化搜索。