3.4 标号和其他流程控制语句
3.4.1 标号
标号是一个标识符,用于给某程序块一个名字。格式如下:
标号:语句
标号是一标识符,用冒号将标号与其后面的语句(块)分开。例如,给for循环块一标号Loop的格式如下:
Loop:for(int i = 0,sum = 0;i < 10;i ++)sum += i;
由于Java语言未提供goto语句,故标号不与goto一起使用。下面介绍的break语句和continue语句可根据需要使用标号。
3.4.2 break语句
break语句和下一节介绍的continue语句可以看成结构化的goto语句。break语句的功能是终止执行包含break语句的一个程序块。break语句除了可应用于前面介绍的switch语句中外,还可应用于各种循环语句中。break语句的格式如下:
break [标号];
break有两种形式:不带标号和带标号。标号必须位于break语句所在的封闭语句块的开始处。
【例3.12】用break终止循环。
class BreakLoop{ public static void main(String args[]){ for(int i=0; i<100; i++) { if(i == 5) break; // 若i为5则终止循环 System.out.println("i: " + i); } System.out.println("Loop完成"); } }
程序运行结果如下:
i: 0 i: 1 i: 2 i: 3 i: 4 Loop完成
在这个例子中,循环测试表达式是i<100,由于在循环体中加入了分支语句,当i的值为5时,执行到break语句,它使得程序控制跳出循环,继续执行for循环以后的语句。
break语句只终止执行包含它的最小程序块,而有时希望终止更外层的块,用带标号的break语句就可实现这种功能,它使得程序流程控制转移到标号指定层次的结尾。
【例3.13】用break终止外层循环。
class BreakDemo { public static void main(String args[]) { boolean t = true; first: { // 定义块first second: { // 定义块second third: { // 定义块third System.out.println("在break之前。"); if(t) break second; // break终止second块 System.out.println("本语句将不被执行。"); } System.out.println("本语句将不被执行。"); } System.out.println("在second块后的语句。"); }
} }
程序运行结果如下:
在break之前。 在second块后的语句。
标号提供了一种简单的break语句所不能实现的控制循环的方法,当在循环语句中遇到break时,不管其他控制变量,都会终止。正常的break只退出一重循环,可以用标号标出想退出的任一重循环。
3.4.3 continue语句
continue语句只能用在循环中,它的功能是使得程序跳过循环体中continue语句后剩下的部分(即短路),终止当前这一轮循环的执行。continue语句的格式如下:
continue [标号];
continue语句有带标号和不带标号两种形式。不带标号的continue语句在while或do-while语句中使流程直接跳到循环条件的判断上;在for语句中则直接计算表达式3 的值,再根据表达式2的值是true或false决定是否继续循环。
【例3.14】以每行两个数据的格式输出数字0~9。
class ContinueDemo { public static void main(String args[]) { for(int i = 0; i < 10; i ++) { System.out.print(i + " "); if (i % 2 == 0) continue; System.out.println( ); // 本语句在执行到continue时被跳过 } } }
程序运行结果如下:
0 1 2 3 4 5 6 7 8 9
这里,当然也可以不用continue,只要改写成如下形式
if(i % 2 != 0)System.out.println( );
即可。continue语句提供另一种风格,也就是若continue后面多于一个语句,它比用if省掉一对花括号和一层嵌套。
continue语句和break语句一样,也可以和标号结合使用。这个标号名必须放在循环语句之前,用于标志这个循环体。执行了内循环体的continue语句后,将进行由标号标明的循环语句的下一轮循环。
【例3.15】求3~N之间的所有素数,使用带标号的continue语句。
import javax.swing.JOptionPane; class PrimeNbelow{ public static void main(String args[]){
String s=JOptionPane.showInputDialog("N="); // 用对话框输入N int n=Integer.parseInt(s); loop:for(int i=3;i<=n;i++){ for(int j=2;j<=i/2;j++)if(i % j ==0)continue loop; System.out.printf("%4d",i); } System.out.println(); } }
在本程序中,执行到continue loop语句时,流程控制转移到loop标记的外层for循环的下一次循环中去执行。
3.4.4 return语句
return语句的功能是从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一语句继续程序的执行。return语句的格式如下:
return [表达式];
或
return([表达式]);
当用void定义了一个返回值为空的方法时,方法体中不一定要有return语句,程序执行完,它自然返回。若要从程序中间某处返回,则可使用return语句。若一个方法的返回类型不是void类型,那么就用带表达式的return语句。表达式的类型应该同这个方法的返回类型一致或小于返回类型。例如一个方法的返回类型是double类型时,return语句表达式的类型可以是double、float或者是short、int、byte、char等。例如:
double exam(int x,double y,boolean b){ if(b) return x; else return y; }