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"到底是干什么的?请解释。感谢
finally
子句更改try子句的"完成原因"。有关详细解释,请参阅JLS 14.20.2-最后执行try-catch,并参阅JLS 14.1语句的正常和突然完成。
这是Java语言中一种奇怪的边缘情况。最佳实践是不要故意更改finally
子句中的控制流,因为读者很难理解这种行为。
这是另一个病理学的例子:
// DON'T DO THIS AT HOME kids
public int tricky() {
try {
return 1;
} finally {
return 2;
}
}
finally子句中的代码绑定执行。
流程如下:
因此,在try块中将i
的值递增到1
之后,它会遇到return语句。但是,它最终也阻止了。因此,它执行最后的块和它们的再次,它将i
的值递增到2
。然后遇到闯入,循环退出。
因此,i = 2
的值在末尾。希望水流畅通。
它中断循环并"重写"返回。
- 始终执行
finally
块 finally
中发生的事情可以覆盖在抛出异常、返回语句之前发生的事情
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显示的内容。