Tag: language design

最后一个variables是否可以重新分配,即使赋值是在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()这样的事情,这可能会导致exception抛出“空气”,但我仍然不知道如何可以抛出后,这显然是最后一个行动在try-block内。 如果允许的话,上面的习语会使我的许多方法更简单。 请注意,这个用例对语言有一stream的支持,比如Scala,它始终使用Maybe monad: final int i = calculateIndex().getOrElse(1); 我认为这个用例是一个非常好的动机,可以允许我在一个特定的情况下, i 绝对没有在catch-block内分配 。 UPDATE 经过一番思考,我更加确定这只是JLS模型的一个弱点:如果我在上面的例子中声明了公理,当控制到达catch-block时, i肯定是未分配的,它不会和其他任何冲突公理或定理。 编译器将不会允许i在读取i之前将其分配给catch-block,所以无论i是否被分配,都不能被观察到。

为什么我们需要打破案件陈述?

为什么编译器不会在交换机中的每个代码块之后自动放置break语句? 是因为历史原因吗? 你什么时候需要多个代码块来执行?