【问题标题】:How can I break from a try/catch block without throwing an exception in Java如何在不引发 Java 异常的情况下从 try/catch 块中中断
【发布时间】:2011-09-25 22:02:55
【问题描述】:

我需要一种从 try/catch 块的中间中断而不抛出异常的方法。 类似于 for 循环中的 break 和 continue 的东西。 这可能吗?

关于抛出一个自定义异常(将其命名为“BreakContinueException”),我一直很奇怪,该异常在其 catch 处理程序中没有任何作用。我敢肯定这是非常扭曲的。

那么,有什么我不知道的直接解决方案吗?

【问题讨论】:

    标签: java try-catch-finally


    【解决方案1】:

    这样做的正确方法可能是通过将 try-catch 块放在单独的方法中来分解方法,并使用 return 语句:

    public void someMethod() {
        try {
            ...
            if (condition)
                return;
            ...
        } catch (SomeException e) {
            ...
        }
    }
    

    如果代码涉及大量局部变量,您还可以考虑使用标记块中的break,如Stephen C 所建议的那样:

    label: try {
        ...
        if (condition)
            break label;
        ...
    } catch (SomeException e) {
        ...
    }
    

    【讨论】:

    • @aioobe: 如果方法应该返回 void 以外的东西怎么办?
    • @Gruber,我想我不明白这个问题。在第一个 sn-p 中,您必须在 return 关键字之后放置一个表达式,并在方法的底部包含一个 return 语句。
    【解决方案2】:

    您始终可以使用循环构造中的 break 或 aioobies 答案中指定的标记为 break 来完成此操作。

    public static void main(String[] args) {
        do {
            try {
                // code..
                if (condition)
                    break;
                // more code...
            } catch (Exception e) {
    
            }
        } while (false);
    }
    

    【讨论】:

    • 这种方式会运行 try catch 的 finally {} 块吗?
    • IMO, do ... while(false) 应该被认为是标签声明的糟糕替代品。
    • 我同意@StephenC。除非您计划循环,否则不应使用循环。任何读过你的代码的人都会感到困惑,包括从现在起 2 个月后的你自己。
    • @BasilMusa 当一个代码块被break 关键字打破时,该块被认为是“突然完成”。抛出异常时也是如此;一段代码将“突然”退出。这与“正常”完成/退出相反。 finally 块在它们各自的 try 块正常突然完成时获得执行,因此执行实际上会转到 finally,如果它存在,就在你“中断”到的任何地方之前。
    【解决方案3】:

    各种方式:

    • return
    • breakcontinue 在循环中时
    • break 在标记语句中标记(参见@aioobe 的示例)
    • break 在 switch 语句中。

    ...

    • System.exit() ...虽然你可能不是这个意思。

    在我看来,如果您只是想摆脱 try/catch,“打破标签”是最自然(最不扭曲)的方式。但是对于从未接触过 Java 结构的新手 Java 程序员来说可能会感到困惑。

    虽然标签不明确,但我认为将代码包装在 do ... while (false) 中以便您可以使用 break 是一个更糟糕的主意。这将使非新手和新手感到困惑。新手(和非新手!)最好了解带标签的语句。


    顺便说一句,return 适用于您需要突破finally 的情况。但是您应该避免在finally 块中使用return,因为语义有点混乱,并且容易让读者头疼。

    【讨论】:

      【解决方案4】:

      有几种方法可以做到:

      1. 将代码移入新方法并从中return

      2. 将 try/catch 包装在 do{}while(false); 循环中。

      【讨论】:

        【解决方案5】:

        这是我通常做的代码:

         try
         {
            ...........
            throw null;//this line just works like a 'break'
            ...........   
          }
          catch (NullReferenceException)
          { 
          }
          catch (System.Exception ex)
          {
              .........
          }
        

        【讨论】:

        • 1) 这不是有效的 Java。 2)问题是关于在不引发异常的情况下突破try。您明确抛出异常。
        【解决方案6】:

        在 catch 块中的这个示例中,我更改了计数器的值,它会在块中中断:

        class TestBreak {
            public static void main(String[] a) {
                int counter = 0;
        
                while(counter<5) {
                    try {
                        counter++;
                        int x = counter/0;
                    }
                    catch(Exception e) {
                        counter = 1000;    
                    }
                }
            }
        }k
        

        【讨论】:

        • 1) 问题是关于在不抛出异常的情况下退出尝试。您正在隐蔽地抛出一个异常,而且这种方式对于 JIT 编译器来说可能太难优化了。 2) 捕捉Exception 是不好的。
        猜你喜欢
        • 2014-04-15
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 2019-11-19
        • 2019-04-26
        相关资源
        最近更新 更多