【问题标题】:Exception parameter of uni-catch may be effectively final?uni-catch 的异常参数可能是有效的最终参数?
【发布时间】:2014-05-09 01:10:07
【问题描述】:

来自The Java® Language Specification:的声明

uni-catch 子句的异常参数永远不会隐含 声明了final,但实际上可能是最终的。

可能是在这里暗示了什么。请举例说明。

【问题讨论】:

  • 我认为你应该看看有效final的定义。
  • @SotiriosDelimanolis 我谷歌搜索,发现没有改变的变量实际上是最终的,但是当我阅读Java doc 时,我发现上面的语句,我很困惑,异常参数may be 实际上是最终的@ 987654325@ 块。我无法想象这是什么意思。
  • 可能是实际上是最终的,因为任何参数都可能是最终的。

标签: java javadoc java-8


【解决方案1】:

4.12.4 部分中的 JLS8 状态:

如果局部变量或方法、构造函数、lambda 或异常参数未声明为 final,但它永远不会作为赋值运算符的左操作数(第 15.26 节)或前缀的操作数出现,则它实际上是 final或后缀递增或递减运算符(§15.14、§15.15)。

在下面的例子中,变量e有效的final。这意味着它可以用于 lambda 表达式匿名内部类

try {
    throw new RuntimeException("foobar");
} catch (RuntimeException e) {
    Runnable r = () -> { System.out.println(e); };
    r.run();
}

在以下示例中,变量e 不是 有效的最终,因为对该变量进行了赋值。这意味着,它不能在 lambda 表达式匿名内部类 中使用:

try {
    throw new RuntimeException("foo");
} catch (RuntimeException e) {
    e = new RuntimeException("bar", e);
    Runnable r = () -> { System.out.println(e); }; // ERRROR
    r.run();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多