在Java文檔中,我正在閱讀: finally塊在try塊退出時總是執行。這可確保即使發生意外異常也能執行finally塊。但是最後對於不僅僅是異常處理而言非常有用 - 它允許程序員避免由於返回,繼續或中斷而意外繞過清理代碼。在Java中使用break/continue退出try塊
什麼時候你會退出一個嘗試中斷或繼續?我能想到的唯一場景是你正在try塊中運行一個循環,並且使用break/continue退出,但應該退出循環之外而不是try塊本身?
在Java文檔中,我正在閱讀: finally塊在try塊退出時總是執行。這可確保即使發生意外異常也能執行finally塊。但是最後對於不僅僅是異常處理而言非常有用 - 它允許程序員避免由於返回,繼續或中斷而意外繞過清理代碼。在Java中使用break/continue退出try塊
什麼時候你會退出一個嘗試中斷或繼續?我能想到的唯一場景是你正在try塊中運行一個循環,並且使用break/continue退出,但應該退出循環之外而不是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塊或從抓回來或者最終或任何其他的「邊緣案」的事情可能應該簡化。 JLS明確指出在這些情況下會發生什麼......但這並不意味着您應該在真正的程序中使用它們。
對於一個完全人爲的例子:
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();
}
}
}
}
這是完全自然的,你可能想返回,休息一下,或繼續(或拋出異常)一試內。在這個例子中,如果finally不能保證執行,你會有資源泄漏。
是的,這個問題可以通過try-with-resource in JDK7來解決。
是,break
/continue
只會影響循環,而不是try
/catch
/finally
塊。該文檔只是指出,在嘗試處理異常時,意外錯過(不執行)一塊清理代碼很容易,特別是那些改變流程的鬼鬼祟祟的break
s和continue
!
該finally block should always be executed,除非System.exit()
被調用或JVM崩潰!
Java有標籤。標籤通常與中斷和繼續運營商一起使用。所以,代碼:
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);
}
只打印「記者:0」
而且由於突破,並繼續被「標記」,可以用「嘗試」循環塊內聲明,而且塊內,你可以嘗試調用「continue」或「break outer_loop」。但是「最後」聲明阻止了這種退出,正如您在引文中所描述的那樣。
是可能的,使用break語句我們可以退出try塊與標籤和的幫助,而無需使用循環。
tryLabel:
try {
if(true)
break tryLabel;
System.out.println("try");
}catch(Exception e) {
System.out.println("catch");
e.printStackTrace();
}finally{
System.out.println("finally");
}
你的意思是'finally'的存在可以防止通過內部try/catch觸發循環嗎? –
@AquariusPower,我的意思是,代碼鏈接:http://pastebin.com/M76QKXNf 將打印這兩個打印。 所以我已經顯示break/continue語句可以實現到任何一個塊,不僅可以阻止哪個是「父」到「嘗試」塊。 換句話說,問題的作者並不知道break&continue可以有一個「參數」。 –