您的位置 首页 java

Java中的break和continue语句还可以这样玩,兼讲empty语句

常规编程中,对于 break 和continue的应用,最典型的应用场景往往是用在循环控制语句中。

其实,对这两个关键字,它们不只是跳出当前循环和继续下一次循环,还有更多的其它应用场景,本文就来围绕这两个关键字做个进一步探讨。

本文是相对基础的编程学习,如果有读者想从头多快好省的学习 Java 编程,推荐购买@牛旦教育IT课堂 的这个专栏从头跃:

下面就来介绍如何全面完整break和continue。

1.break语句

break语句用于从 程序块 (循环体和代码块)中退出。 有两种形式的break语句:

• 未标记break语句

• 标签break语句

一个没有标记的break语句的例子是:

break;
 

一个有标记的break语句的例子是:

break label;
 

我们经常在 switch for循环 while 循环和do-while语句中使用未标记的break语句。 它将控制权从switch、for循环、while-loop和do-while语句中转移出来。 在这四种嵌套语句的情况下,如果在内部语句中使用了未标记的break语句,则它仅将控制权转移出内部语句块,而不是转出外部语句。 假设您想要如图所示打印3×3矩阵的下半部分(矩阵对角线及以下的元素):

11

21 22

31 32 33

要仅打印3×3矩阵的下半部分,可以编写以下代码片段:

for(int i = 1; i <= 3; i++) {
for(int j = 1; j <= 3; j++) {
System.out.print ( i + "" + j);
if (i == j) {
break; // 退出 内循环 语句块
}
 System.out.print("t");
}
System.out.println();
}
 

11

21 22

31 32 33

break语句已在内部for循环语句中使用。 当外循环计数器(i)的值等于内循环计数器(j)的值时,将执行break语句,并退出内循环。 如果要从内部for循环语句中退出外部for循环语句,则必须使用带 标签的break语句 。 Java中的标签是任何有效的Java标识符,后跟冒号。 以下是Java中的一些有效标签:

• label1:

• alabel:

• Outer:

• Hello:

• IamALabel:

现在在前面的示例中使用带标签的break语句并查看结果。

outer: // 定义一名为outer的标签
for(int i = 1; i <= 3; i++ ) {
  for(int j = 1; j <= 3; j++ ) {
  System.out.print(i + "" + j);
 if (i == j) {
  break outer; // 退出外部循环
  }
  System.out.print("t");
  }
 System.out.println();
 } // 外部标签在此结束
 

前面的代码片段的输出如下:

11

为什么它只打印3×3矩阵的一个元素? 这次你在内部的for循环语句中使用了一个带标签的break语句。 当i == j第一次值为true时,会执行带标签的break语句。 它将控制权转移到已标记为outer的块外。 请注意,外部标签出现在外部for循环语句之前。 因此,与外部标签关联的块是外部for循环语句。 带标签的break语句 不仅可以用在switch,for,while和do-while语句中, 相反,它可以用于任何类型的块语句。 以下是标记为break的简单例子:

blockLabel:
{//块开始
 int i = 10;
 if (i == 5) {
 break blockLabel; // 退出blocklabel块
 }
 if (i == 10) {
 System.out.println("i is not five");
 }
}//块结束
 

要记: 一个带标记的break语句的 重要一点是,与break语句一起使用的标签,必须是使用该标签标记的break语句所在的块标签 。 以下代码片段说明了标签break语句的不正确使用:

lab1:
{
 int i = 10;
 if (i == 10)
 break lab1; // Ok. lab1 标签可用
 }
lab2:
{
 int i = 10;
 if (i == 10)
 // 编译时错误. lab1 不能用在此处
 // 因为此块没有与lab1标记关联
 //此块仅能使用lab2标记.
 break lab1;
}
 

2.Continue语句

continue语句只能在for循环、while循环和do-while语句中使用。 有两种形式的continue语句:

• 未标记continue语句

• 已标记continue语句

未标记continue语句示例:

continue ;
 

已标记continue语句示例:

continue label ;
 

当在for循环中执行continue语句时,会跳过当前循环体中的其余语句,并执行表达式列表中的表达式。 如下所示,可以使用for语句打印1到10之间的所有奇数整数:

for (int i = 1; i < 10; i += 2) {
 System.out.println(i);
}
 

在这个for语句中,在表达式列表中将i的值增加2。 可以使用continue语句重写以前的for-loop语句,如下图所示。

图-1 在for循环语句中使用continue语句

表达式i%2返回的值为i除以2的值,且表达式i%2 == 0返回true情况。 在这种情况下,将执行continue语句并跳过最后一条语句System.out.println(i)。 递增语句i++是在continue语句执行之后执行的。前面的代码片段当然不是使用continue语句的最好例子,然而,它的目的是说明它的用法。^_^

当在while循环或do-while循环内执行未标记的continue语句时,会跳过循环中的其余语句,并为下一次迭代而计算 条件表达式 。 例如,下图2中的代码片段将在while循环内使用continue语句打印1到10之间的所有奇数整数。

图-2. 在while循环语句中使用continue语句

在for循环和while循环中使用continue语句的主要区别是控制权转移的地方。 在for循环中,控制转移到 表达式列表 中,在while循环中将控制转移到 条件表达式 。 这就是为什么for循环语句不能总是在不修改某些逻辑的情况下转换为while循环语句的原因。

未标记的continue语句总是持续最内层的for循环、while循环和do-while循环。 如果你正在使用嵌套循环语句,则需要使用带标签的continue语句在外部循环中继续。 例如,您可以使用如下所示的continue语句重新编写打印3×3矩阵的下半部分的代码片段:

outer: // 标签outer开始处
for(int i = 1; i <= 3; i++) {
 for(int j = 1; j <= 3; j++) {
 System.out.print(i + "" + j);
 System.out.print("t");
 if (i == j) {
 System.out.println(); // 换行
 continue outer; // 继续下一次的outer循环
 }
 }
} //标签 "outer"结束处
 

补充一点,空语句:

3.Empty语句

一个空的语句本身就是一个分号。 一个空的语句什么都不做。 如果一个空的语句没有做任何事情,为什么要它? 有时候一个语句作为构造语法的一部分是必要的。但是,你可能不需要做任何有意义的事情。 在这种情况下,将使用空语句。 for循环必须有与之相关的语句。 但是,要打印1到10之间的所有整数,可只使用for循环语句的初始化、条件表达式和表达式列表部分实现。 在这种情况下,你没有与for语句关联的语句。 因此,在这种情况下使用空语句,如下所示:

for(int i = 1; i <= 10; System.out.println(i++))
 ; // 此分号(;)就是for循环的空语句
 

有时,使用空语句来避免代码中的双重否定逻辑。 假设noDataFound是一个布尔变量。 可以编写一段代码,如下所示(当然你可以不这样干):

if (noDataFound)
 ; // 一个空语句
else {
 // 做些处理
}
 

前面的if-else语句可以在不使用空语句的情况下这样编写:

if (!noDataFound) {
 // 做些处理
}
 

使用哪种代码,是个人选择的事情。 最后, 请注意, 如果您键入两个或更多分号(只需要一个分号),则不会导致任何错误,因为每个额外的分号都被视为空语句。 例如:

i++; // Ok.没问题,分号式语句的一部分
i++;; // 依然可行,第二个分号被认为是个空语句
 

如果语句不被允许,则不能使用空语句。 例如,当只允许一个语句时,添加一个额外的空语句会导致错误,最常见的估计就是if语句了。如下面的代码片段所示。 它将两个语句联系在一起:i++;和一个空语句(;),一个if语句,只允许一个语句。

if (i == 10)
 i++;; //编译时错误.else语句前不能使用两个语句
else
 i--;
 

当你有个好习惯,即把条件或循环语句都用一对大括号包围起来,那这错误就能避免了。

最后,给出一个小练习, 通过循环和标记break和continue语句实现:

1)挑出100以内的整数的几个奇数;

2)一个数一行,把1到挑出数之间的自然数在一行打印出来。

自己动手玩下试试吧。

留意:我会在留言中给出一个参考答案。

文章来源:智云一二三科技

文章标题:Java中的break和continue语句还可以这样玩,兼讲empty语句

文章地址:https://www.zhihuclub.com/194783.shtml

关于作者: 智云科技

热门文章

网站地图