项目实践精解:Java核心技术应用开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

5.3 Java控制语句

计算机语言通过控制语句执行程序流从而完成一定的任务。程序流由若干个语句组成,语句可以是单独的一条语句,如z=x+y,也可以是用大括号{}括起来的复合语句。

计算机语言需要3种流程:顺序(Sequence)、分支(Branch)和循环(Loop)。

顺序(Sequence):应用程序一行一行顺序执行。

分支(Branch):使程序根据表达式的结果或变量的状态选择不同的执行路径。

循环(Loop):使程序能够重复执行一条或多条语句(也就是说,重复语句形成循环)。

Java的控制语句主要有以下几种。

分支语句:if-else,switch。

循环语句:while,do-while,for。

与程序转移有关的其他语句:break,continue,return。

异常处理语句:try-catch-finally,throw。

其中,异常处理语句将专门在后面的章节讨论。下面先介绍一下其他几种语句。

5.3.1 顺序流程

顺序流程是最简单的流程,应用程序默认的就是一行一行顺序执行。这里就不详细介绍了。

5.3.2 分支流程

分支流程图如图5-1所示。

图5-1 分支流程图

1.if-else语句

第一种分支语句是if-else,结构如下:

        if(boolean-expression1)
        {
                statements1;
        }
        else if(boolean-expression2)
        {
                statements2;
        }
        …
        else
        {
                statementsN;
        }

其中,布尔表达式boolean-expression是任意一个返回布尔数据类型值的表达式,而且必须是布尔数据类型。另外,每个单一语句后面都要有分号。为了增强程序的可读性,应将if或else后的语句用{}括起来。

else子句是任选的,不能单独作为语句使用,它必须和if语句配对使用,并且总是与离它最近的if配对。

2.switch-case语句

第二种分支语句是多分支语句switch-case,结构如下:

        switch (expression)
        {
        case value1:
        {
              statements1;
              break;
        }
        …
        case valueN :
        {
              statementsN;
              break;
        }
        [default:
        {
              defaultStatements;
        }]
        }

其中:

表达式expression的返回值类型必须是int,byte,char,short类型之一。

case子句中的值value必须是常量,而且所有case子句中的值应是不同的。

default子句是任选的,并且可以放在任何位置。

break语句用来在执行完一个case分支后,使程序跳出switch语句,即终止switch语句的执行。如果某个case分支后没有break语句,程序将不再作比较而执行下一个分支。

switch语句的功能可以用if-else语句来实现,但某些情况下,使用switch语句更简练。

下面是分支语句的使用实例。

        /*
        * 演示if-else/switch-case语句的使用
        */
        package sample;
        public class IfTest {
          public void judge(int i){
                int sw = 0;
                if(i > 0) sw = 1;
                else if( i < 0) sw = -1;
                switch(sw) {
                case 1:
                      System.out.println("i is a positive number");
                      break;
                case 0:
                      System.out.println("i is zero");
                      break;
                case -1:
                      System.out.println("i is a negative number");
                      break;
                }
      }
                /**
            * @param args命令行参数
            */
                public static void main(String[] args) {
                IfTest it = new IfTest();
                it.judge(10);
                it.judge(0);
                it.judge(-2);
                }
        }

此程序运行结果如下:

        i is a positive number
        i is zero
        i is a negative number

5.3.3 循环流程

循环流程图如图5-2所示。

图5-2 循环流程图

1.while语句(当型循环)

        [initialization]              //初始化条件
        while (termination){          //循环条件
            body;                     //循环体
            [iteration;]              //迭代,变更循环条件
        }

当表达式termination为true时,执行{}中的语句,否则终止循环。

2.do-while语句(直到型循环)

        [initialization]              //初始化条件
        do{
          body;                       //循环体
          [iteration;]                //迭代,变更循环条件
        } while (termination)         //循环条件

首先执行一遍{}中的语句,当表达式termination为true时,继续执行{}中的语句,否则终止循环。

3.for语句(另一种当型循环)

        for (initialization; termination; iteration)// initialization为初始化条件
                                                    //termination为循环条件
                                                    //iteration为迭代,变更循环条件
        {
              body;                                 //循环体
        }

for语句的执行时,首先进行初始化操作,然后判断终止条件是否满足,如果满足,则执行循环体中的语句,最后执行迭代部分。完成一次循环后,重新判断终止条件。

for语句的初始化、终止以及迭代部分都可以为空语句(但分号不能省略),当三者均为空的时候,相当于一个无限循环。在初始化部分和迭代部分可以使用逗号语句进行多个操作。逗号语句是用逗号分隔的语句序列。

        for( int i=0, int j=10; i<j; i++, j--)
        {
        …
        }

4.for-each语句(增强型循环)

JDK的版本在不断升级后,增加了很多新的特性。在JDK5.0以后的版本中,增加了for-each循环,目的是简化对数组和Collection类型集合的访问,特点是简单。例如,在没有for-each循环时,我们可以这样操作数组。

        String[] array = new String[]{“leon”,”gary”,”linda”};//定义数组
          for(int i=0;i<array.length;i++){
              String element = array[i];
              System.out.println(element);
          }

在使用了新的增强型for-each循环后,代码得到了简化。

        String[] array = new String[]{“leon”,”gary”,”linda”};
        for(String element:array){
          System.out.println(element);
        }

有关数组的内容,请参见后面的章节。

增强型的for-each循环语句从数组或者Collection集合中连续一一取出其中保存的元素,简化了Java程序员遍历数组或者集合的操作。

5.3.4 与程序转移有关的其他语句

1.break语句

在switch语句中,break语句用来终止switch语句的执行,使程序从整个switch语句后的第一条语句开始执行。

在Java中,可以为每个代码块加一个标号,一个代码块通常是用大括号{}括起来的一段代码。加标号的格式为:

        BlockLabel: {
                        codeBlock;
                    }

break语句就是让程序跳出后面的标号所指定的块,并从紧跟该块后的第一条语句处开始执行。

        break  BlockLabel;

注意: 因为标号会带来程序混乱,我们应该尽量避免使用它。

2.continue语句

continue语句用来结束本次循环,跳过循环体中下面尚未执行的语句,接着进行终止条件的判断,以决定是否继续循环。对于for语句,在进行终止条件的判断前,还要先执行迭代语句。continue语句的格式为:

        continue;

也可以用continue语句跳转到标号指定的外层循环中,这时的格式为:

        continue outerLable;

3.return语句

return语句用来从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续程序的执行。返回语句有两种格式:

        return expression;       //当方法需要返回某种类型数据时
        return;                  //当方法的返回类型为void时

单独一条return语句放在方法中间时,会产生编译错误,因为其后的语句将不会执行。若真需要退出方法,可以通过将return语句嵌入某些语句(如if-else)中来使程序在未执行完方法中的所有语句时退出。

5.3.5 异常处理语句:try-catch-finally

在进行程序设计时,错误是不可避免的。如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?这是任何程序设计语言都涉及的问题。Java语言是通过异常(Exception)来处理错误的,这里会用到try-catch-finally等流程控制语句。我们将在后面的内容中详细介绍异常及其处理方法。