网站首页 > 精选教程 正文
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 break
if( 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 。
猜你喜欢
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.3相等测试与继承
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 5.2.4 hashCode方法
- 2024-11-28 Java入门书单
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3.7 隐式参数与显式参数
- 2024-11-28 全网最完整的免费java教程讲义系列(四)——java的流程控制
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.6 对象构造 4.6.1重载
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 3.10 数组
- 2024-11-28 java 核心技术-12版 卷Ⅰ- 4.3 自定义类
- 2024-11-28 2019年Java核心技术我整理了200多页pdf,今天分享给你
- 2024-11-28 java 核心技术12版卷1 - 1.3 Java applet 与 Internet
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)