龙空技术网

java 核心技术-12版 卷Ⅰ- 3.8.6 break

CC躺平混吃 80

前言:

如今朋友们对“java核心卷”都比较关心,你们都想要知道一些“java核心卷”的相关内容。那么小编在网络上网罗了一些有关“java核心卷””的相关知识,希望各位老铁们能喜欢,我们一起来学习一下吧!

3.8.6 break

尽管Java的设计者将 goto 仍作为一个保留字,但实际上并不打算在语言中包含 goto。通常,使用goto 语句会被认为是一种拙劣的程序设计风格。也有一些程序员认为反对goto 的呼声似乎有些过分(例如,Donald Knuth 就曾写过一篇名为Structured Programming with goto statement 的著名文章)。他们认为,无限制地使用goto 语句确实很容易导致错误,但在有些情况下,偶尔使用goto 跳出循环还是有益处的。Java 设计者同意这种看法,甚至在Java 语言中增加了一条新的语句,带标签的 break,以此来支持这种程序设计风格。

​下面首先来看不带标签的break。与用于退出switch语句的break 语句一样,它也可以用于退出循环。例如:

while(years <= 1000){    balance += payment;    double interest = balance * interestRate/ 100;    balance += interest;    if(balance >= goal)         break;    years ++;}

​循环开始时,如果 years >1000, 或者如果循环中间 balance >= goal ,则退出循环。当然,也可以在不使用break的情况下计算 years 的值。如下:

while(years <= 1000 && balance  < goal ){    balance += payment;    double interest = balance * interestRate/ 100;    balance += interest;    if(balance < goal)         years ++;}

但是需要注意,在这个版本中,检测了两次 balance < goal 。为了避免重复检测,有些程序员更偏爱使用break 语句。

对比两者

​与C++不同,Java还提供了一种带标签的break 语句,允许跳出多重嵌套循环。有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时你可能希望完全跳出所有的循环。如果只是为各层循环检测添加一些额外条件,这会很不方便。

​下面的例子展示了break 语句如何工作。请注意,标签必须放在你想跳出的最外层循环之前,并且必须紧跟一个冒号。 参考 代码3

Scanner in = new Scanner(System.in);int n;readData :while  (. . .) // this loop statement is tagged with the label	for (.. .){ // this inner loop is not labeled		System.out.print("Enter a number >= 0:");		n = in.nextInt();		if (n <0) // should never happen-can't go on			break readData;// break out of read data loop	}}// this statement is executed immediately after the labeled breakif( n < 0 ) {  // check  for bad situation   // deal with bad situation} else {	// carry out normal processing	}   

如果输入有误,执行带标签的break 会跳转到带标签的语句块末尾。与任何使用break 语句的代码一样,接下来需要检测循环是正常退出,还是由于break 提前退出。

​注释:有意思的是,可以将标签应用于任何语句,甚至可以应用到if 语句或者代码块,如下:

lable: {   	...if(condition) break label; // exits block	...}// jumps here when the break statement executes

因此,如果确实希望使用 goto 语句,而且一个代码块恰好在你想要跳转到的位置之前结束,就可以使用 break 语句! 当然,我并不提倡使用这种方法。另外需要注意,只能跳出语句块,而不能跳入语句块。

​最后,还有一个 continue 语句。与break语句一样,它将中断正常的控制流程。continue语句将控制转移到最内层外围循环的首部。例如:

Scanner in = new Scanner(System.in);while (sum < goal) {	System.out.print("Enter a number:");	n = in.nextInt();	if (n < 0) 		continue;	sum += n; // not executed if n <0}

如果 n<0,则 continue 语句会越过当前循环体的剩余部分,直接跳到循环首部。如果在 for 循环中使用 continue 语句,会跳转到 for 循环的“更新”部分。例如:

for (count = 1; count <= 100; count++) {	System.out.print("Enter a number, -1 to quit:");	n = in.nextInt0);	if (n < 0) 		continue;	sum += n; // not executed if n < 0}

​ ​如果n < 0 ,则continue 语句将跳转到 count++ 语句。

​还有一种带标签的 continue 语句,将跳转到有匹配标签的循环的首部。

​提示: 许多程序员发现 break 和 continue 语句很容易混淆。这些语句完全是可选的,即不使用这些语句也能表达同样的逻辑。在本书中,所有程序都不会使用 break 和continue 。

标签: #java核心卷