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