我非常确信这里
final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }
i
如果控制到达 catch-block,则不可能已经分配。但是,Java 编译器不同意并声称the final local variable i may already have been assigned
.
我在这里是否还遗漏了一些微妙之处,或者这只是 Java 语言规范用来识别潜在重新分配的模型的一个弱点?我主要担心的是Thread.stop()
,这可能会导致“凭空”抛出异常,但我仍然不知道在分配后如何抛出它,这显然是 try-block 中的最后一个操作.
如果允许,上面的成语将使我的许多方法更简单。请注意,此用例在 Scala 等语言中具有一流的支持,它始终使用Maybe monad:
final int i = calculateIndex().getOrElse(1);
我认为这个用例是一个很好的动机,允许 在 catch-blocki
中绝对未分配的一个特殊情况。
更新
经过一番思考,我更加确定这只是 JLS 模型的一个弱点:如果我声明公理“在给出的示例中,i
当控制到达 catch-block 时肯定是未分配的”,它不会与任何其他公理冲突或定理。编译器将不允许i
在捕获块中分配之前进行任何读取,因此i
无法观察是否已分配的事实。