繁体   English   中英

捕获未在本地抛出的异常?

[英]Catch exceptions which are not thrown locally?

我的问题与try catch块的语法行为有关

空的尝试块与捕获这样

void fun() {
    try {}
    catch(Exception e) {}
}

要么

try {}
catch(ArrayIndexOutOfBoundsException e) {}

编译好但编译器抱怨

try {}
catch(IOException e) {}

为什么编译器允许捕获任何类型为Exception或RuntimeException的东西,而它却抱怨带有已检查异常的无法访问的代码? 是因为JVM代码可以抛出这些类型吗? JVM怎么可能在空的try块中抛出ArrayIndexOutOfBoundsException?

空块是一种特殊情况,不是由JLS专门处理的。 什么JLS 确实需要的是,如果赶上检查异常,在代码try块必须已经能够抛出该异常(即,它直接扔了或者叫那个被宣布可能把它的方法)。

换句话说,有一个专门针对已检查异常的健全性检查,但不会对所有异常情况进行额外考虑。

这在JLS 14.21中有描述,具体来说:

如果由于无法访问语句而无法执行语句,则会发生编译时错误。

...

如果满足以下两个条件,则可以访问catch块C

  • 任一类型C的参数是一个未经检查的异常类型Exception或类的超类Exception ,或在try块一些表达或throw语句可到达的,并且可以抛出检查异常类型为分配给的类型C的参数。 (如果包含它的最内层语句可以访问,则表达式是可到达的。)

    正常和突然完成表达式见§15.6。

  • 有没有更早的catch块A try语句,使得该类型C的参数相同或类型的子类A的参数。

添加强调:它表明如果您捕获未经检查的异常类型,则可以访问catch块。

我个人觉得措辞有点令人困惑。 稍微重写一下,第一个要点就是说catch子句必须抓住以下一个:

  • 未经检查的异常
  • Exception
  • Throwable (除了Object之外唯一的Exception超类,你无法捕获)
  • try块可以抛出的已检查异常

针对第二项中后卫catch块,因为以前的不可达catchtry 例如:

try {
    whatever();
} catch (Exception e) {
    handleException(e);
} catch (NullPointerException e) {
    // This block is unreachable, because a NullPointerException is an
    // Exception and will thus be handled by the previous catch block.
    handleNpe(e);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM