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'。我所期待的是什么都不应该打印出来。究竟什么'打破'在这做什么?请解释。感谢
答案 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)
它打破了循环并“覆盖”了回报。
finally
块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所显示的。