请查看下一个代码行:
public void methodBla(){
try{
system.out.println(2/0);
{
catch(MyArithmeticException me){
system.out.println("Error: My exception");
}
catch(Exception a){
system.out.println("Error: general exception");
}
}
当我尝试使用自定义类捕获ArithmeticException时,我不明白为什么:我的 ArithmeticException,它扩展了ArithmeticException。
Public class MyArithmeticException extends ArithmeticException{
public MyArithmeticException(String str){
super("My Exception " + str);
}
}
MyArithmeticException没有捕获它,它只捕获第二个" catch"(catch(异常a))。
由于 ž
答案 0 :(得分:2)
这很简单,因为语句2/0
不会抛出MyArithmeticException
。抛出ArithmeticException
并且由于你没有捕获ArithmeticException
,它会被第二次捕获所捕获。
java语言不知道您是否要从任何语言定义的异常中派生自己的异常类型。因此,如果你需要抛出自己的类型,你应该抓住它并将其作为ArithmeticException
重新抛出:
public void methodBla(){
try{
try{
system.out.println(2/0);
catch(ArithmeticException e){
throw new MyArithmeticException(e);
}
}
catch(MyArithmeticException me){
system.out.println("Error: My exception");
}
catch(Exception a){
system.out.println("Error: general exception");
}
}
祝你好运。
答案 1 :(得分:0)
问题是会抛出算术异常。不是" MyAritmeticException"所以它不能被第一个catch子句捕获,所以它导致第二个catch子句。
换句话说,2/0将抛出一个AritmeticException,它是异常的超类,因此它不会分解MyArithmeticException catch块,因为它是一个子类。
如果要自定义异常消息,可以在catch语句中执行此操作,您可以在Exception#getMessage()
或Exception#getLocalizedMessage();
处获取消息(可以找到两者的差异{ {3}})