Java finally子句中的break语句

Java finally子句中的break语句,java,break,try-catch-finally,Java,Break,Try Catch Finally,在上述代码中,输出为“2”。我所期待的是什么都不应该被打印出来。“break”在这里到底做什么?请解释一下。谢谢它打破了循环并“覆盖”了返回 最后始终执行块 在finally中发生的事情可以覆盖之前发生的事情-抛出异常、返回语句 finally子句更改try子句的“完成原因”。有关详细说明,请参阅,参考 这是Java语言中奇怪的边缘情况之一。最佳实践是不要故意更改finally子句中的控制流,因为读者很难理解该行为 这是另一个病理学的例子: public class FinallyTest

在上述代码中,输出为“2”。我所期待的是什么都不应该被打印出来。“break”在这里到底做什么?请解释一下。谢谢

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

  • 最后
    始终执行块
  • 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
    }