Java语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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;
              }