Java基础篇:如何使用 break 退出循环

157 阅读5分钟

在 Java 中, break 语句有 3 种作用。第一,你已经看到,在 switch 语句中,它被用来终止 一个语句序列。第二,它能被用来退出一个循环。第三,它能作为一种“先进”的goto 语句来使用。下面对最后 2 种用法进行解释。

使用 break 退出循环

可以使用 break 语句直接强行退出循环,忽略循环体中的任何其他语句和循环的条件测 试。在循环中遇到break 语句时,循环被终止,程序控制在循环后面的语句重新开始。下面是一个简单的例子:

// Using break to exit a loop. 
class BreakLoop { 
 public static void main(String args[]) { 
  for(int i=0; i<100; i++) { 
  if(i == 10) break; // terminate loop if i is 10 
  System.out.println("i: " + i); 
  } 
  System.out.println("Loop complete."); 
 } 
 }

该程序产生如下的输出:

i: 0 
i: 1 
i: 2 
i: 3 
i: 4 
i: 5 
i: 6 
i: 7 
i: 8 
i: 9 
Loop complete.

正如你看到的那样,尽管 for 循环被设计为从 0 执行到 99 ,但是当 i 等于 10 时, break 语 句终止了程序。

break 语句能用于任何 Java 循环中,包括人们有意设置的无限循环。例如,将上一个程 序用while 循环改写如下。该程序的输出和刚才看到的输出一样。

// Using break to exit a while loop. 
class BreakLoop2 { 
 public static void main(String args[]) { 
  int i = 0; 

while(i < 100) { 
 if(i == 10) break; // terminate loop if i is 10 
 System.out.println("i: " + i); 
 i++; 
}
System.out.println("Loop complete."); 
} 
}

在一系列嵌套循环中使用 break 语句时,它将仅仅终止最里面的循环。例如:

class BreakLoop3 { 
 public static void main(String args[]) { 
  for(int i=0; i<3; i++) { 
  System.out.print("Pass " + i + ": "); 
  for(int j=0; j<100; j++) { 
  if(j == 10) break; // terminate loop if j is 10 
  System.out.print(j + " "); 
 } 
System.out.println(); 
} 
System.out.println("Loops complete."); 
} 
}

该程序产生如下的输出:

Pass 0: 0 1 2 3 4 5 6 7 8 9 
Pass 1: 0 1 2 3 4 5 6 7 8 9 
Pass 2: 0 1 2 3 4 5 6 7 8 9 
Loops complete.

从中可以看出,在内部循环中的 break 语句仅仅终止了该循环,外部的循环不受影响。 关于break ,在这里要记住两点。首先,一个循环中可以有一个以上的 break 语句。但要小心,太多的break 语句会破坏你的代码结构。其次, switch 语句中的 break 仅仅影响该 switch 语句,而不会影响其中的任何循环。

把 break 当作 goto 的一种形式来用

break 语句除了在 switch 语句和循环中使用之外,它还能作为 goto 语句的一种“文明” 形式来使用。Java 中没有 goto 语句,因为 goto 语句提供了一种改变程序运行流程的非结构化方式。这通常使程序难以理解和难于维护。它也阻止了某些编译器的优化。

但是,有些 地方goto语句对于构造流程控制是有用的而且是合法的。例如,从嵌套很深的循环中退出时, goto 语句就很有帮助。因此, Java 定义了 break 语句的一种扩展形式来处理这种情况。

通过使用这种形式的 break ,你可以终止一个或者几个代码块。这些代码块不必是一个循环或一个switch 语句的一部分,它们可以是任何的块。 而且,由于这种形式的 break 语句带有标签,你可以明确指定执行从何处重新开始。你将看到,break 带给你的是 goto 的益处,并 舍弃了goto 语句带来的麻烦。

标签 break 语句的通用格式如下所示:

break label;

这里,标签 label 是标识代码块的标签。当这种形式的 break 执行时,控制被传递出指定 的代码块。被加标签的代码块必须包围break 语句,但是它不需要是直接的包围 break 的块。 这意味着你可以使用一个加标签的break 语句退出一系列的嵌套块。但是你不能使用 break 语句将控制传递到不包含break 语句的代码块。

要指定一个代码块,在其开头加一个标签即可。标签( label )可以是任何合法有效的 Java标识符后跟一个冒号。一旦你给一个块加上标签后,你就可以使用这个标签作为 break语句的对象了。这样做会使执行在加标签的块的结尾重新开始。例如,下面的程序示例了 3 个嵌套块,每一个都有它自己的标签。break 语句使执行向前跳,调过了定义为标签 second 的代码块结尾,跳过了2 个 println ( ) 语句。

// Using break as a civilized form of goto. 
class Break { 
 public static void main(String args[]) { 
  boolean t = true; 

first: { 
 second: { 
  third: { 
  System.out.println("Before the break."); 
  if(t) break second; // break out of second block 
  System.out.println("This won't execute"); 
  } 
  System.out.println("This won't execute"); 
 } 
 System.out.println("This is after second block."); 
} 
} 
}

运行该程序,产生如下的输出:

Before the break. 
This is after second block.

标签 break 语句的一个最普遍的用法是退出循环嵌套。例如,下面的程序中,外层的循 环只执行了一次:

// Using break to exit from nested loops 
class BreakLoop4 { 
 public static void main(String args[]) { 
  outer: for(int i=0; i<3; i++) { 
  System.out.print("Pass " + i + ": "); 
  for(int j=0; j<100; j++) { 
  if(j == 10) break outer; // exit both loops 
  System.out.print(j + " ");
 } 
 System.out.println("This will not print"); 
} 
System.out.println("Loops complete."); 
} 
}

该程序产生如下的输出:

Pass 0: 0 1 2 3 4 5 6 7 8 9 Loops complete.

你可以看到,当内部循环退到外部循环时,两个循环都被终止了。

记住如果一个标签不在包围 break 的块中定义,你就不能 break 到该标签。例如,下面的 程序就是非法的,且不会被编译:

// This program contains an error. 
class BreakErr { 
  public static void main(String args[]) { 

    one: for(int i=0; i<3; i++) { 
    System.out.print("Pass " + i + ": "); 
 } 

  for(int j=0; j<100; j++) { 
  if(j == 10) break one; // WRONG 
  System.out.print(j + " "); 
 } 
} 
}

因为标签为 one 的循环没有包围 break 语句,所以不能将控制传递到该块。