捕获异常会捕获该异常的父类

时间:2014-09-29 16:05:35

标签: java exception

在Java中,我有一个方法来捕获扩展'NewException'的异常'ChildException'。如果该方法调用另一个抛出'NewException'的方法,让我们说某事发生并抛出它;捕获异常抛出的子类的调用者方法会捕获它吗?

public MethodCatchingChildException
{
  try
  {
     //stuff
     callingMethodThrowingNewException();
     //stuff
  }
  catch (ChildException e)
  {
     //stuff
  }
}

在MethodCatchingChildException中是否会捕获来自callingMethodThrowingNewException的异常?

3 个答案:

答案 0 :(得分:3)

catch子句将捕获与声明的异常类型赋值兼容的任何异常。在您描述的情况下,NewException的实例(不是ChildException将不会被catch子句捕获,因为您无法将NewException对象分配给{ {1}}变量。

规则在section 14.20.1 of the Java Language Specification中详细说明:

  

如果由于抛出值V而导致try块的执行突然完成,那么可以选择:

     
      
  • 如果V的运行时类型与try语句的任何catch子句的可捕获异常类(§5.2)兼容,则选择第一个(最左边)这样的catch子句。将值V分配给所选catch子句的参数,并执行该catch子句的Block,然后有一个选择:

         
        
    • 如果该块正常完成,则try语句正常完成。

    •   
    • 如果该块因任何原因突然完成,则try语句会因同样的原因突然完成。

    •   
  •   
  • 如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,那么try语句会因为抛出值V而突然完成。

  •   

答案 1 :(得分:1)

将其视为 instanceof 测试

e.g。

if (e instanceof ChildException) {
 ...
}

因此,指定类类型将捕获类其子类。

答案 2 :(得分:0)

它只会捕获您指定的Exception或它的子类。只需编写它就可以捕获父Exception并保证您的安全。