发布
社区首页 >问答首页 >在Java中使用break/continue退出try块

在Java中使用break/continue退出try块
EN

Stack Overflow用户
提问于 2013-04-13 10:51:48
回答 5查看 19.9K关注 0票数 3

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

什么时候会以中断或继续退出try块?我能想到的唯一场景是,你在try块内运行一个循环,然后使用break/continue退出,但这应该只在循环外退出,而不是try块本身,对吗?

EN

回答 5

Stack Overflow用户

发布于 2013-04-13 11:01:12

什么时候会以中断或继续退出try块?

当你在一个循环中有一个try时;

代码语言:javascript
代码运行次数:0
复制
 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或finally返回的代码片段,或者任何其他“边缘情况”的东西都应该被简化。JLS清楚地规定了在这些情况下会发生什么……但这并不意味着你应该在真正的程序中使用它们。

票数 6
EN

Stack Overflow用户

发布于 2013-04-13 11:08:57

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

代码语言:javascript
代码运行次数:0
复制
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“。但是,正如您在引文中所描述的那样,"finally“语句阻止了这种退出。

票数 3
EN

Stack Overflow用户

发布于 2013-04-13 11:01:12

举一个完全人为设计的例子:

代码语言:javascript
代码运行次数:0
复制
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中,您可能希望返回、中断或继续(或抛出异常),这是非常自然的。在本例中,如果不能保证执行finally,就会造成资源泄漏。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15983691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档