自定义运行时异常未捕获java.lang.ArrayIndexOutOfBoundsException
任何人都能知道为什么抓球的人都在躲闪,而不是抓球?catch块仅在没有自定义异常的情况下工作自定义运行时异常未捕获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
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:}方法来优化搜索。