首页 文章

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

提问于
浏览
2

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

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

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

3 回答

  • 1

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

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

    如果try块的执行由于抛出值V而突然完成,则可以选择:如果V的运行时类型与(第5.2节)兼容,则可以使用任何catch子句的可捕获异常类 . try语句,然后选择第一个(最左边)这样的catch子句 . 将值V分配给所选catch子句的参数,并执行该catch子句的Block,然后有一个选择:如果该块正常完成,则try语句正常完成 . 如果该块因任何原因突然完成,则try语句突然完成,原因相同 . 如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,那么try语句会因为抛出值V而突然完成 .

  • 0

    把它想象成一个测试实例

    例如

    if (e instanceof ChildException) {
     ...
    }
    

    所以指定一个类类型将捕获该类及其子类 .

  • 3

    它只会捕获您指定的Exception或它的子类 . 只需编写它就可以捕获父Exception并且您是安全的 .

相关问题