当前位置: 首页 > 面试题库 >

为什么在这种情况下抛出检查异常类型?

相弘和
2023-03-14
问题内容

我偶然发现该throw语句(从一些更复杂的代码中摘录)进行编译:

void foo() {
    try {

    } catch (Throwable t) {
        throw t;
    }
}

在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾:

void foo() {
    try {

    } catch (Throwable t) {
        Throwable t1 = t;
        throw t1;
    }
}

try块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为t表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?)


问题答案:

我认为您提到的§14.18
throw语句
中的措辞是JLS中的错误-
应该使用Java SE 7更新了该文本,而没有。

§11.2.2语句异常分析中描述了预期行为的JLS文本部分:

如果一条throw语句的抛出表达式catch子句C的最终异常参数或实际上是最终异常参数,则该语句可以引发异常类E iff:

  • E是一个异常类,声明C trytry语句的块可以抛出该异常类;和
  • E是与C的任何可捕获异常类兼容的分配;和
  • E与catch同一try语句中C左侧声明的子句的任何可捕获异常类的分配都不兼容。

第一个要点是相关的。因为catch-clause参数t实际上是最后的参数(意味着它从未分配,递增或递减;请参见§4.12.4
final变量),throw t因此只能抛出该try块可能抛出的内容。

但是正如您所说,第14.18节中的编译时检查对此没有任何余地。§11.2.2不能决定允许什么和不允许什么;相反,它应该是对可能引发的各种限制的后果的分析。(此分析确实反馈到规范的更规范的部分中-§14.18本身在第二个要点中使用了它-但§14.18不能仅说“如果它抛出一个异常而无法编译,这是一个编译时错误。按照§11.2.2“进行抛出,因为那是循环的。)

因此,我认为需要对§14.18进行调整以适应§11.2.2的意图。

好发现!



 类似资料:
  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • 我想知道为什么java编译器允许在方法声明中抛出,而方法永远不会抛出异常。因为“throws”是处理异常的一种方式(告诉调用方处理它)。 因为有两种处理异常的方法(抛出和try/catch)。在try/catch中,它不允许捕获try块中未抛出的异常,但它允许在不抛出异常的方法中抛出。

  • 问题内容: 在下面的源代码中,我抛出一个。 为什么没有必要将关键字放在方法的签名上? 问题答案: 仅在Java 1.7上会出现此现象。使用1.6进行编译时,出现以下编译器错误消息: 但是,使用Java 1.7可以编译。 …直到我实际把一个块扔了进去: 编译中… 看起来Java 1.7足够聪明,可以通过分析块代码来检测可能抛出的类型,而1.6刚看到类型并为此给出了错误。 对其进行更改以使其按预期方式

  • 问题内容: 我编写了以下代码来实现Singleton模式: 当我编译此文件时,它应该生成Test.class和Test $ TestHolder.class,但它还会生成Test $ 1.class。这没有道理。那么,为什么以及如何呢? 问题答案: 类需要在中调用私有构造函数。但是它是私有的,实际上不能从另一个类中调用。因此,编译器发挥了作用。它 添加了一个仅知道的新的非私有构造函数!_该构造函数

  • 我有一个h2作为唯一的项目在一个容器div。我在容器上使用position:relative和h2上使用position:absolute/bottom:0使它与容器底部对齐。但是,我无法使h2文本与容器div的右侧对齐。 HTML: CSS: 链接:http://www.distributionaccess.com/new/stempath/about.html 我在h2上尝试了display:

  • 我用干净的架构在android项目上工作。 我有以下课程: 使用public dispose()方法从onNext实现中释放序列。 但我还是不明白使用它的好处。是否用于在销毁视图时从observable取消订阅,以便从转到并关闭发射器上的订阅?