3.4循环控制
循环控制包含两方面的内容,一方面是控制循环变量的变化方式,另一方面是控制循环的跳转。控制循环的跳转需要用到break和continue两个关键字,这两条跳转语句的跳转效果不同,break语句是中断循环,continue语句是执行下一次循环。
3.4.1 break语句
使用break语句可以跳出switch结构。在循环结构中,同样也可用break语句跳出当前循环体,从而中断当前循环。
【例1】输出1~20出现的第一个偶数
创建BreakTest类,循环输出1~20的偶数值,在遇到第一个偶数时,使用break语句结束循环。
public class BreakTest{public static void main(String[] args){for(int i = 1;i < 20;i++){if(i % 2 == 0){ //如果i是偶数System.out.println(i); //输出i的值break; //结束循环}}System.out.println("---end---"); //结束时输出一行文字}
}
运行结果如下:
2
---end---
注意:
循环嵌套情况下,break语句将只会使程序流程跳出包含它的最内层的循环结构,即只跳出一层循环。
如果想让break跳出外层循环,Java提供了“标签”的功能,语法如下:
标签名:循环体{
break 标签名;
}
☑ 标签名:任意标识符。
☑ 循环体:任意循环语句。
☑ break标签名:break跳出指定的循环体,此循环体的标签名必须与break的标签名一致。
带有标签的break可以指定跳出的循环,这个循环可以是内层循环,也可以是外层循环。
【例2】使用标签让break结束外层循环
创建BreakInsideNested类,在该类中写两层for循环,第一层for语句循环3次,第二层for语句循环5次。当第二层for语句循环至第4次时,强行用break中断循环。输出程序执行时外层循环和内层循环各循环了多少次。
public class BreaklnsideNested{public static void main(String[] args){for(int i = 1;i <= 3;i++){ //外层循环for(int j = 1;j <= 5;j++){ //内层循环if(j == 4){ //内层循环至第4次时就结束break;}System.out.println("i="+i+"j="+j);}}}
}
运行结果如下:
i=1 j=1
i=1 j=2
i=1 j=3
i=2 j=1
i=2 j=2
i=2 j=3
i=3 j=1
i=3 j=2
i=3 j=3
从这个运行结果可以看出:
☑ 循环中的if语句判断:如果j等于4时,执行break语句,则中断了内层的循环,输出的j值最大到3为止。
☑ 外层的循环没有受任何影响,输出的i值最大为3,正是for循环设定的最大值。
现在改一下这段代码,给外层循环添加一个名为Loop的标签,让内层循环结束Loop,再查看运行结果。
public class BreaklnsideNested{public static void main(String[] args){Loop:for(int i = 1;i <= 3;i++){ //外层循环for(int j = 1;j <= 5;j++){ //内层循环if(j == 4){ //内层循环至第4次时就结束 break Loop;}System.out.println("i="+i+"j="+j);}}}
}
运行结果如下:
i=1 j=1
i=1 j=2
i=1 j=3
从这个结果可以看出,当j的值等于4时,直接结束外层循环,i的值不再增加。
3.4.2 continue语句
continue语句是针对break语句的补充。continue不是立即跳出循环体,而是跳过本次循环,回到循环的条件测试部分,重新开始执行循环。在for循环语句中遇到continue后,首先执行循环的增量部分,然后进行条件测试。在while和do...while循环中,continue语句使控制直接回到条件测试部分。
【例3】输出1~20的奇数
创建ContinueTest类,编写一个for循环从1循环至20,如果当前循环的次数为偶数,则使用continue语句跳过循环。
public class ContinueTest{public static void main(String[] args){for(int i = 1;i <= 20;i++){if(i % 2 == 0){ //如果i是偶数continue; //跳到下一循环}System.out.println(i); //输出i的值}}
}
运行结果如下:
1
3
5
7
9
11
13
15
17
19
与break语句一样,continue也支持标签功能,语法如下:
标签名:循环体{
continue 标签名;
}
☑ 标签名:任意标识符。
☑ 循环体:任意循环语句。
☑ continue标签名:continue跳出指定的循环体,此循环体的标签名必须与continue的标签名一致。