53.控制流程的关键字
使用break语句可以终止switch语句和终止循环的子语句块,甚至是普通的程序块。关于如何终止switch语句,前面已经说过。这里主要说明如何来控制循环语句的执行。
?
1.break语句
?
在循环中,经常的,我们需要在某种条件出现时,强行终止循环的运行,而不是等到循环的判断条件为false时,这个时候,可以通过break来完成这个功能。
下面来看一个break的例子:
?int sum1 = 0,n=10;
?for (int i=1;i<=n;i++){
??sum1=sum1+i;
??if(i%2==0)break;
?}
这个例子中,如果i能够被2整除,就跳出这个for循环。
?
因此,实际上,这个for循环只能循环两次,得到的sum1的值是3。
?
对于很多有C++或其他编程经验的读者,可能对于goto语句不会陌生,也可能曾经深受其困。在Java中,goto语句虽然是保留字,但并没有使用它。但在Java里也有类似goto的功能,这个功能和break以及continue结合。
?
在本质上而言,它和goto语句的跳跃是不同的,它是一种循环中断的方式而已。它和goto语句的相同点在于,它们都使用了标签(label)。
所谓标签(label),就是后面跟了一个冒号“:”的标识符,如:
oneLabel:
从语法上看,在Java程序中,标签可以放在任意的地方,但是,一般而言,标签只有放在循环语句之前,才能真正起到应有的作用,如下:
LableOne:
循环
{
… …
}
我们来看一个用在嵌套循环中的和标签结合的break例子:
??outer:
??for(int i = 0;i<10;i++) {
???System.out.println("Outer loop:");
???inner:
????while(true) {
?????int k = System.in.read();
?????System.out.println("Inner Loop:"+k);
?????if(k=='b') break inner;
?????if(k=='q') break outer;
????}
??}
在这个例子中,从控制台接收一个输入,如果输入b,则退出内层的while循环,如果输入q则退出外层的循环(也就是终止整个循环)。
?
另外,如果需要终止普通的语句块(既不是switch也不是循环语句),则必须使用标签:
Label1:
?{
?Label2:
??{
??Lable 3:
???{
???…. …
???}
??}
?}
?
2.continue语句
?
continue语句用来略过循环中剩下的语句,重新开始新的循环,这和break语句的完全跳出循环是不一样的。
continue 仅仅出现在while/do…while/for语句的子语句块中。
也可以使用和标签结合的方式来选择需要终止的嵌套循环的层级。
下面来看一个例子:
?int sum1=0;????????????????????
?int sum2=0;????????????????????
?//Continue?????????????????????
?for (int j=1;j<=10;j++) ?{??????????????????????????????
??if(j%2==0)continue;????
??sum2=sum2+j;???????????
?}??????????????????????????????
?System.out.println(sum2);?
在这个例子中,如果在j可以被2整除,则不进行后面的相加操作,而重新返回到循环的开头
?
因此,它运算后的值为:25。完整的代码请参考示例4-11中的BreakAndContinue.java中的Continue部分。
在上一小节介绍break的时候,我们就提到过,在continue中也可以使用标签。
?
现在我们来看一个continue和标签结合的例子:
源文件:ContinueWithLabelDemo.java
public class ContinueWithLabelDemo {
?public static void main(String[] args) {
??String searchMe = "Look for a substring in me";
??String substring = "subs";
??boolean foundIt = false;
??int max = searchMe.length() - substring.length();
??test: for (int i = 0; i <= max; i++) {
???int n = substring.length();
???int j = i;
???int k = 0;
???while (n-- != 0) {
????if (searchMe.charAt(j++) != substring.charAt(k++)) {
?????// 跳出的本次循环是for循环,而不是while循环
?????continue test;
????}
???}
???foundIt = true;
???// 跳出整个循环
???break test;
??}
??System.out.println(foundIt ? "Found it" : "Didn't find it");
?}
}
这个程序的作用是从字符串searchMe中搜索指定的子串substring,从要搜索的字符串substring(假设为“subs”)第一个子符开始去匹配searchMe的第一个字符,如果第一个字符都不匹配,就不用再比较第二个字符了(利用continue)。
?
如果第一个字符匹配,则比较第二个字符,如果第二个字符不匹配,则不用再往下比较,否则,往下比较第三个字符,依次类推。
?
如果找到完全匹配的子字符串,则退出整个循环(break)并且返回true。然后根据是否返回true打印出“Found it”或“Didn’t find it”。
如果substring的值为“subs”(如程序中所示),则会在控制台上打印出“Found it”,如果substring的值为“abc”,则会打印出“Didn’t find it”。