【问题标题】:Will catching an exception catch a parent class of that exception将捕获异常捕获该异常的父类
【发布时间】:2014-11-24 02:21:20
【问题描述】:

在 Java 中,我有一个方法可以捕获扩展“NewException”的异常“ChildException”。如果该方法调用了另一个抛出“NewException”的方法,并且假设发生了某些事情并抛出了它;捕获抛出异常的子类的调用者方法会捕获它吗?

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

那么,callingMethodThrowingNewException 的异常会被 MethodCatchingChildException 捕获吗?

【问题讨论】:

  • 你倒退了。抓住父母会抓住孩子,但反之则不然。
  • 很抱歉,您可以编写代码并查看结果
  • 好吧,实际上我不知道我在哪里。这就是我在这里问的原因。我正在研究一些不属于我且无法编译的代码。

标签: java exception


【解决方案1】:

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

规则写在section 14.20.1 of the Java Language Specification:

如果 try 块的执行由于抛出值 V 而突然完成,那么有一个选择:

  • 如果 V 的运行时类型与 try 语句的任何 catch 子句的可捕获异常类 (§5.2) 赋值兼容,则选择第一个(最左侧)此类 catch 子句。将值V赋给选中的catch子句的参数,执行那个catch子句的Block,然后就有了选择:

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

    • 如果该块由于某种原因突然完成,那么 try 语句也会出于同样的原因而突然完成。

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

【讨论】:

    【解决方案2】:

    把它想象成一个instanceof测试

    例如

    if (e instanceof ChildException) {
     ...
    }
    

    所以指定类类型将捕获类它的子类。

    【讨论】:

      【解决方案3】:

      它只会捕获您指定的异常或其子类。只需编写它,以便它捕获父异常并且您是安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2010-10-08
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        相关资源
        最近更新 更多