finally子句java中的break语句

时间:2011-07-02 09:35:05

标签: java break try-catch-finally

  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'。我所期待的是什么都不应该打印出来。究竟什么'打破'在这做什么?请解释。感谢

4 个答案:

答案 0 :(得分:10)

finally子句更改try子句的“完成原因”。有关详细说明,请参阅JLS 14.20.2 - Execution of 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;
    }
}

答案 1 :(得分:5)

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

以下是流程:

因此,在try块中将i的值递增到1后,它会遇到return语句。但是,它终于阻止了。因此它最终执行阻止和它们再次,它将i的值增加到2。然后退出遇到的中断和循环。

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

答案 2 :(得分:4)

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

    始终执行
  1. finally
  2. finally中发生的事情可以覆盖以前发生的事情 - 抛出异常,返回陈述。

答案 3 :(得分: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所显示的。