为什么自定义Exception没有抓住这个? (JAVA)

时间:2016-01-31 11:59:31

标签: java exception arithmeticexception

请查看下一个代码行:

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))。

由于 ž

2 个答案:

答案 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}})