9
  public class FinallyTest {
    static int i=0;
    public static void main(String a[]){
        while(true){
            try{
                i=i+1;
                return;
            }finally{
                i=i+1;
                break;
            }
        }
        System.out.println(i);
    }
}

在上面的代码中输出是'2'。我所期待的是不应该打印任何内容。'break' 在这里究竟做了什么?请解释。谢谢

4

4 回答 4

11

finally子句更改了 try 子句的“完成原因”。详细解释请参考JLS 14.20.2 - try-catch-finally 的执行,参考JLS 14.1 Normal and Abrupt Completion of Statements

这是 Java 语言中那些奇怪的边缘情况之一。最佳实践是不要故意更改finally子句中的控制流,因为这种行为对于读者来说很难理解。

这是另一个病态的例子:

// DON'T DO THIS AT HOME kids
public int tricky() {
    try {
        return 1;
    } finally {
        return 2;
    }
}
于 2011-07-02T09:38:22.707 回答
5

finally 子句中的代码必须执行。

这是流程:

因此,在 try 块中增加ito的值后1,它会遇到 return 语句。但是,它也终于阻塞了。所以它执行 finally 块和它们的再次,它增加ito的值2。然后遇到中断并退出循环。

所以,最后的价值i = 2。希望流程清晰。

于 2011-07-02T09:38:25.983 回答
4

它打破循环并“覆盖”返回。

  1. finally块总是被执行
  2. 中发生的事情finally可以覆盖之前发生的事情——抛出异常、返回语句。
于 2011-07-02T09:37:19.060 回答
0
public static void main(String a[])
{
    while(true) <<< #1
    {
        try
        {
            i=i+1;  <<< #2
            return;
        }
        finally
        {
            i=i+1;  <<< #3
            break;  <<< #4
        }
    }
    System.out.println(i);  <<< #5
}

这就是 BlueJ Tracing 所显示的。

于 2011-07-02T09:42:27.567 回答