我是Java新手。谁能帮我解释一下,为什么捕获没有捕获MyException(扩展了ArrayIndexOutOfBoundsException)?
我的例子:
public class TestClass {
public static void main(String[] args) {
try{
doTest();
}
catch(MyException me){
System.out.println("MyException is here");
}
}
static void doTest() throws MyException{
int[] array = new int[10];
array[10] = 1000;
}
}
class MyException extends ArrayIndexOutOfBoundsException {
public MyException(String msg){
super(msg);
}
}
结果是:
“线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:10在TestClass.doTest(TestClass.java:14)在TestClass.main(TestClass.java:5)”
为什么没有“ MyException在这里”?
最佳答案
您在混淆subtype-supertype-relationship。
代码本身会引发ArrayIndexOutOfBoundsException
,但不会引发MyException
。捕获后者将不起作用,因为AIOOBE不是ME。您的ME是AIOOBE的子类型。
另一方面,AIOOBE具有超类型:IndexOutOfBoundsException
。如果对此具有catch子句,则将获得所需的行为,因为AIOOBE是IOOBE。
或者,您也可以自己扔我自己:throw new MyException(...)