Java finally子句中的break语句
在上述代码中,输出为“2”。我所期待的是什么都不应该被打印出来。“break”在这里到底做什么?请解释一下。谢谢它打破了循环并“覆盖”了返回Java finally子句中的break语句,java,break,try-catch-finally,Java,Break,Try Catch Finally,在上述代码中,输出为“2”。我所期待的是什么都不应该被打印出来。“break”在这里到底做什么?请解释一下。谢谢它打破了循环并“覆盖”了返回 最后始终执行块 在finally中发生的事情可以覆盖之前发生的事情-抛出异常、返回语句 finally子句更改try子句的“完成原因”。有关详细说明,请参阅,参考 这是Java语言中奇怪的边缘情况之一。最佳实践是不要故意更改finally子句中的控制流,因为读者很难理解该行为 这是另一个病理学的例子: public class FinallyTest
最后
始终执行块finally
中发生的事情可以覆盖之前发生的事情-抛出异常、返回语句finally
子句更改try子句的“完成原因”。有关详细说明,请参阅,参考
这是Java语言中奇怪的边缘情况之一。最佳实践是不要故意更改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);
}
}
finally子句中的代码必须执行 以下是流程: 因此,在try块中将
i
的值增加到1
后,它会遇到return语句。但是,它最终也被封锁了。因此,它执行finally块,并再次执行它们,它将i
的值增加到2
。然后遇到中断,循环退出
因此,最后的i=2
。希望流程清晰。公共静态void main(字符串a[])
// DON'T DO THIS AT HOME kids
public int tricky() {
try {
return 1;
} finally {
return 2;
}
}
{
while(true)如果您调试,那么您将立即看到步骤的顺序。尝试在返回之前强制跳转到finally块。“break;”实际上会打断“while”。您想改为打断“finally”吗?非常好。这是非常酷的边缘情况……是的,我调试了代码,但当我使用continue语句时,它应该ld进入无限循环。但它没有发生,相反,我得到了一个错误“try without catch or finally”。这里发生了什么?如果你用continue替换break,编译器应该为println提供无法访问的语句。如果你去掉println,那么你应该拥有无限循环。如果我给continue而不是break,那么它应该进入无限循环。但这并没有发生。它给出了编译错误“try without catch or finally”。为什么会发生这种情况?@Shwetanka-你确定吗?根据JLS,如果你用continue
替换break
,你应该得到一个无限循环。哦,你可能找到了obs修复编译器中的错误。我很确定。我使用的是idea9.0 ide,当我使用continue运行代码时,它会显示“尝试而不捕获或最终”。我无法解决这个问题。@Stephen+Shwetanka:这段代码无限运行:在Eclipse中也是如此。我得到了无限循环,问题在于idea编译器。我使用了另一个编译器,正在工作很好。谢谢你的帮助。如果我给continue而不是break,那么它应该进入无限循环。但这并没有发生。它给了编译错误“try without catch or finally”。为什么会发生这种情况?不,它确实给了一个不同的错误不可访问的语句:System.out.println(I);
:…println语句的注释然后看到,break工作的方式continue应该使此代码在无限循环中逻辑运行,但这不会发生。是的,它确实在无限循环中运行。但是没有什么可打印的。试着调试代码,你自己就会明白。只需添加System.out.println(i);
在finally块中的语句i=i+1
之后。代码无限运行……或者在循环中放置System.out.println()。
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
}