任何人都可以告诉为什么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)
答案 0 :(得分:2)
你为什么期望它?你在catch区有MyException
;它只会捕获该类型的异常。即使MyException
和ArrayIndexOutOfBoundsException
都扩展RuntimeException
,但并不意味着在指定所有子类RuntimeException
>任何子类;只捕获指定的类型。
这样想。假设我有“四边形”,“矩形”和“菱形”。如果我说“抓住任何我扔你的长方形”,你会抓到一个菱形吗?但是,如果我说“抓住任何四边形状,我就会抛弃你”,无论如何你都会抓住它们。
答案 1 :(得分:2)
你是说doTest()
可以抛出MyException
,无论是否可以。尝试访问超出范围的数组索引不会抛出MyException
,它会抛出ArrayIndexOutOfBoundsException
。 Java不会捕获未被抛出的异常。如果您希望运行自定义异常代码,则需要显式抛出它。
try {
array[10] = 1000;
} catch (ArrayIndexOutOfBoundsException e) {
throw new MyException(e.getMessage());
}
这种情况并没有真正受益于此,因此您可以将您的exeption代码移动到catch块内部或将其提取到单独的方法。