我强烈反对使用带标签的 break 语句。它几乎和 GOTO 一样糟糕。一次休息;可以/有必要结束循环或切换等。但根据我的经验:需要这种带标签的中断是不良控制流设计的指标。
在大多数情况下,放置得当的异常会更有意义。但是,如果“跳转条件”可以被视为错误。如果你正确地标记你的方法,你可以影响,什么可以被视为错误。
如果您的方法被称为“getDrink()”并且它返回一个“牛奶”对象,那就没问题了。但是如果你的方法被称为“getWater()”,它应该抛出一个异常而不是返回牛奶......
所以而不是:
public class TestBad {
public static void main(String[] args) {
String[] guys = {"hans", "john"};
myLabel: {
for(String guy: guys) {
String drink = getDrink(guy);
if(drink.equals("milk")) {
// Handle "milk"??
break myLabel;
}
// Do something with "non-milk"
}
}
// Success? Non Success??
}
private static String getDrink(String guy) {
if(guy.equals("hans"))
return "milk";
else
return "water";
}
}
你应该使用:
public class TestGood {
public static void main(String[] args) {
String[] guys = {"hans", "john"};
try {
handleStuff(guys);
} catch (Exception e) {
// Handle Milk here!
}
}
private static void handleStuff(String[] guys) throws Exception {
for(String guy: guys) {
String drink = getWater(guy);
// Do something with "water"
}
}
private static String getWater(String guy) throws Exception {
if(guy.equals("hans"))
// The method may NEVER return anything else than water, because of its name! So:
throw new Exception("No Water there!");
else
return "water";
}
}
Fazit:与其将块嵌套到块或多个循环中,不如嵌套方法并使用适当的异常处理。这增强了可读性和可重用性。