前言:
如今朋友们对“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核心卷