在Java文档中,我正在读这个: 当try块退出时,finally块总是执行。这确保即使发生意外异常也会执行finally块。但最终不仅仅是异常处理有用 - 它允许程序员避免因返回,继续或中断而意外绕过清理代码。
您何时会在休息时退出试用版块?我能想到的唯一场景是你在try块中运行一个循环而你是使用break / continue退出但是这应该只是退出循环而不是try块本身吗?
答案 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只是指出在尝试处理异常时很容易意外遗漏(不执行)一块清理代码,特别是那些改变流程的偷偷摸摸的break
和continue
!
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");
}