使用Java中的break / continue退出try块

时间:2013-04-13 02:51:48

标签: java

在Java文档中,我正在读这个: 当try块退出时,finally块总是执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。

您何时会在休息时退出试用版块?我能想到的唯一场景是你在try块中运行一个循环而你是使用break / continue退出但是这应该只是退出循环而不是try块本身吗?

5 个答案:

答案 0 :(得分:5)

  

您何时会在休息时退出试用版块?

如果你有一个try 一个循环; e.g。

 for (Cat cat : cattery) {
     try {
          cat.removeFromCage();
          cat.healthCheck();
          if (cat.isPedigree()) {
              continue;
          }
          cat.spey();
     } finally {
          cat.putBackInCage();
     }
 }

好的......所以有更优雅的方式来编写“代码”......但这只是一个例子。

  

我能想到的唯一场景是你在try块中运行一个循环而你是使用break / continue退出但是这应该只是退出循环而不是try块本身吗?

这是对的。


FWIW,任何涉及打破try块或从catch或者最后或任何其他“edge case”事物返回的代码都应该简化。 JLS明确指出了在这些场景中发生的事情......但这并不意味着你应该在真实的程序中使用它们。

答案 1 :(得分:3)

Java有标签。并且标签通常与break和continue运算符一起使用。所以,代码:

outer: for (int i=0; i < 1; i++){
  for (int j = 0; j < 1; j++) { 
    System.out.println("j:"+j);
    continue outer;
  }
  System.out.println("i:"+i);
}

将仅打印“j:0”

因为break和continue被'标记',你可以在循环块中使用“try”语句,并且在该块中你可以尝试调用“continue”或“break outer_loop”。但是“最终”声明会阻止退出,正如你在引文中所描述的那样。

答案 2 :(得分:2)

对于一个完全做作的例子:

import java.io.*;

public class Foo {
    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 10; i++) {
            File file = new File("file-" + i);
            FileWriter out = null;
            try {
                out = new FileWriter(file);
                if (file.exists()) return;
                out.write("Number " + i);
                if (i % 2 == 0) continue;
                else if (i % 3 == 0) break;
            } catch (IOException e) {
                throw new RuntimeException(e);
            } finally {
                out.close();
            }
        }
    }
}

您可能希望在尝试中返回,中断或继续(或抛出异常),这是很自然的。在这个例子中,如果不能保证最终执行,那么你就会有资源泄漏。

是的,这个特殊问题由try-with-resource in JDK7解决。

答案 3 :(得分:1)

是的,break / continue应仅影响循环,而不影响try / catch / finally块。 doc只是指出在尝试处理异常时很容易意外遗漏(不执行)一块清理代码,特别是那些改变流程的偷偷摸摸的breakcontinue

finally block should always be executed,除非调用System.exit()或JVM崩溃!

答案 4 :(得分:0)

是的可能,使用中断声明,我们可以标签 退出试用块 不使用循环

tryLabel:
        try {
            if(true)
                break tryLabel;
            System.out.println("try");
        }catch(Exception e) {
            System.out.println("catch");
            e.printStackTrace();
        }finally{
            System.out.println("finally");
        }