
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等流程控制语句。我们将在后面的内容中详细介绍异常及其处理方法。