在Java文档中,我读到了这样的内容:当try块退出时,finally块总是会执行。这确保了即使发生意外的异常,也会执行finally块。但最终不仅仅用于异常处理-它允许程序员避免因返回、继续或中断而意外绕过清理代码。
什么时候会以中断或继续退出try块?我能想到的唯一场景是,你在try块内运行一个循环,然后使用break/continue退出,但这应该只在循环外退出,而不是try块本身,对吗?
发布于 2013-04-13 11:01:12
什么时候会以中断或继续退出try块?
当你在一个循环中有一个try
时;
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清楚地规定了在这些情况下会发生什么……但这并不意味着你应该在真正的程序中使用它们。
发布于 2013-04-13 11:08:57
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“。但是,正如您在引文中所描述的那样,"finally“语句阻止了这种退出。
发布于 2013-04-13 11:01:12
举一个完全人为设计的例子:
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解决的。
https://stackoverflow.com/questions/15983691
复制相似问题