第 四 章   流 控 制



              郁欣 孙元 王曦东 王克宏







与 C、 C++相 同 ,Java程 序 通 过 流 控 制 来 执 行 程 序 流 ,完 成 一 定 ?

个 语 句 组 成 的 。 语 句 可 以 是 单 一 的 一 条 语 句 ( 如 c=a+b; ),也 可 以

复 合 语 句 。



下 面 我 们 分 别 来 介 绍 Java中 的 流 控 制 语 句 ,包 括



1.分 支 语 句 :if-else, break, switch, return.







2.循 环 语 句 :while, do-while, for, continue.



3.例 外 处 理 语 句 :try-catch-finally, throw



最 后 我 们 简 单 介 绍 一 下 注 释 语 句 。



§ 4.1分 支 语 句



分 支 语 句 提 供 了 一 种 控 制 机 制 ,使 得 程 序 的 执 行 可 以 跳 过 ?

些 语 句 不 执 行 ,而 转 去 执

行 特 定 的 语 句 。



4.1.1条 件 语 句 if-else.



if-else语 句 根 据 判 定 条 件 的 真 假 来 执 行 两 种 操 作 中 的 一 种 ,

? 的 格 式 为 :



if(boolean-expression)

statement1;

[else

statement2;]





1.布 尔 表 达 式 boolean-expression是 任 意 一 个 返 回 布 尔 型 数 据 的

达 式 (这 比 C、 C++的 限 制

要 严 格 )。



2.每 个 单 一 的 语 句 后 都 必 须 有 分 号 。



3.语 句 statement1,statement2可 以 为 复 合 语 句 ,这 时 要 用 大 括 号 {}

? 起 。 建 议 对 单 一 的 语 句

也 用 大 括 号 括 起 ,这 样 程 序 的 可 读 性 强 ,而 且 有 利 于 程 序 的 扩 充(

可 以 在 其 中 填 加 新 的 语 句

)。 {}外 面 不 加 分 号 。



4.else子 句 是 任 选 的 。



5.若 布 尔 表 达 式 的 值 为 true,则 程 序 执 行 statement1,否 则 执 行 sta

tement2。



6.if-else语 句 的 一 种 特 殊 形 式 为 :



if(expression1){

statement1

}else if (expression2){

statement2

}……

}else if (expressionM){

statementM

}else {

statementN

}

@@@[

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

。可以通过使用大括号{}来改变配对关系。

7.举例:

例4.1 比较两个数的大小,并按从小到大的次序输出。

@@@[

public class CompareTwo{

public static void main( String args[] ){

double d1=23.4;

double d2=35.1;

if(d2>=d1)

System.out.println(d2+" >= "+d1);

else

System.out.println(d1+" >= "+d2);

}

}

运行结果为:

C:\>java CompareTwo





35.1 >= 23.4



例 4.2 判 断 某 一 年 是 否 为 闰 年 。



闰 年 的 条 件 是 符 合 下 面 二 者 之 一 :① 能 被 4整 除 ,但 不 能 被 100

整 除 ;② 能 被 4整 除 ,又 能 被

100整 除 。



public class LeapYear{

public static void main( String args[] ){

int year=1989; //method 1

if( (year%4==0 && year%100!=0) || (year%400==0) )

System.out.println(year+" is a leap year.");

else

System.out.println(year+" is not a leap year.");

year=2000; //method 2

boolean leap;

if( year%4!=0 )

leap=false;

else if( year%100!=0 )

leap=true;

else if( year%400!=0 )

leap=false;

else

leap=true;

if( leap==true )

System.out.println(year+" is a leap year.");

else

System.out.println(year+" is not a leap year.");

year=2050; //method3

if( year%4==0){

if( year%100==0 ){

if( year%400==0)

leap=true;

else

leap=false;

}else

leap=false;

}else

leap=false;

if( leap==true )

System.out.println(year+" is a leap year.");

else

System.out.println(year+" is not a leap year.");

}

}

运行结果为

C:\>java LeapYear

1989 is not a leap year.

2000 is a leap year.

2050 is not a leap year.





该 例 中 ,方 法 1用 一 个 逻 辑 表 达 式 包 含 了 所 有 的 闰 年 条 件 ,方

? 2使 用 了 if-else语 句 的 特 殊

形 式 ,方 法 3则 通 过 使 用 大 括 号 {}对 if-else进 行 匹 配 来 实 现 闰 年 的

? 断 。 大 家 可 以 根 据 程 序 来

对 比 这 三 种 方 法 ,体 会 其 中 的 联 系 和 区 别 ,在 不 同 的 场 合 选 用 适

? 的 方 法 。



4.1.2多 分 支 语 句 switch



switch 语 句 根 据 表 达 式 的 值 来 执 行 多 个 操 作 中 的 一 个 ,它 的

般 格 式 如 下 :



switch (expression){

case value1 : statement1;

break;

case value2 : statement2;

break;

…………

case valueN : statemendN;

break;

[default : defaultStatement; ]

}





1.表 达 式 expression可 以 返 回 任 一 简 单 类 型 的 值 (如 整 型 、 实 ?

、 字 符 型 ),多 分 支 语 句 把

表 达 式 返 回 的 值 与 每 个 case子 句 中 的 值 相 比 。 如 果 匹 配 成 功 ,则

? 行 该 case子 句 后 的 语 句 序

列 。



2.case子 句 中 的 值 valueI必 须 是 常 量 ,而 且 所 有 case子 句 中 的 值

是 不 同 的 。



3.default子 句 是 任 选 的 。 当 表 达 式 的 值 与 任 一 case子 句 中 的 ?

都 不 匹 配 时 ,程 序 执 行

default后 面 的 语 句 。 如 果 表 达 式 的 值 与 任 一 case子 句 中 的 值 都 不

? 配 且 没 有 default子 句 ,则 程

序 不 作 任 何 操 作 ,而 是 直 接 跳 出 switch语 句 。



4.break语 句 用 来 在 执 行 完 一 个 case分 支 后 ,使 程 序 跳 出 switch语

? ,即 终 止 switch语 句 的 执 行

。 因 为 case子 句 只 是 起 到 一 个 标 号 的 作 用 ,用 来 查 找 匹 配 的 入 口

? 从 此 处 开 始 执 行 ,对 后 面

的 case子 句 不 再 进 行 匹 配 ,而 是 直 接 执 行 其 后 的 语 句 序 列 , 因 此

该 在 每 个 case分 支 后 ,要 用

break来 终 止 后 面 的 case分 支 语 句 的 执 行 。



在 一 些 特 殊 情 况 下 ,多 个 不 同 的 case值 要 执 行 一 组 相 同 的 操

,这 时 可 以 不 用 break。



5.case分 支 中 包 括 多 个 执 行 语 句 时 ,可 以 不 用 大 括 号 {}括 起 。



6.switch语 句 的 功 能 可 以 用 if-else来 实 现 ,但 在 某 些 情 况 下 ,使

switch语 句 更 简 炼 ,可 读 性 强

,而 且 程 序 的 执 行 效 率 提 高 。



7.举 例 :



例 4.3.根 据 考 试 成 绩 的 等 级 打 印 出 百 分 制 分 数 段 。



public class GradeLevel{

public static void main( String args[] ){

System.out.println("\n** first situation **");

char grade='C'; //normal use

switch( grade ){

case 'A' : System.out.println(grade+" is 85~100");

break;

case 'B' : System.out.println(grade+" is 70~84");

break;

case 'C' : System.out.println(grade+" is 60~69");

break;

case 'D' : System.out.println(grade+" is <60");

break;

default : System.out.println("input error");

}

System.out.println("\n** second situation **");

grade='A'; ∥creat error without break statement

switch( grade ){

case 'A' : System.out.println(grade+" is 85~100");

case 'B' : System.out.println(grade+" is 70~84");

case 'C' : System.out.println(grade+" is 60~69");

case 'D' : System.out.println(grade+" is <60");

default : System.out.println("input error");

}

System.out.println("\n** third situation **");

grade='B'; ∥several case with same operation

switch( grade ){

case 'A' :

case 'B' :

case 'C' : System.out.println(grade+" is >=60");

break;

case 'D' : System.out.println(grade+" is <60");

break;

default : System.out.println("input error");

}

}

}

运行结果为

C:\>java GradeLevel

**** first situation ****

C is 60~69

**** second situation ****

A is 85~100

A is 70~84

A is 60~69

A is <60

input error

**** third situation ****

B is >=60





从 该 例 中 我 们 可 以 看 到 break语 句 的 作 用 。



4.1.3 break语 句



1.在 switch语 中 ,break语 句 用 来 终 止 switch语 句 的 执 行 。 使 程 序

switch语 句 后 的 第 一 个 语 句

开 始 执 行 。



2.在 Java中 ,可 以 为 每 个 代 码 块 加 一 个 括 号 ,一 个 代 码 块 通 常

用 大 括 号 {}括 起 来 的 一 段

代 码 。 加 标 号 的 格 式 如 下 :



BlockLabel: { codeBlock }



break语 句 的 第 二 种 使 用 情 况 就 是 跳 出 它 所 指 定 的 块 ,并 从 紧

? 该 块 的 第 一 条 语 句 处 执

行 。 其 格 式 为 :



break BlockLabel;

例如:

a:{…… //标记代码块a

b: {…… //标记代码块b

c: {…… //标记代码块c

break b;

…… //will not be executed

}

…… //will not be executed

}

…… //will not be executed

}

…… /execute from here

}





3.与 C、 C++不 同 ,Java中 没 有 goto语 句 来 实 现 任 意 的 跳 转 ,因 为 go

to语 句 破 坏 程 序 的 可 读 性

,而 且 影 响 编 译 的 优 化 。 但 是 从 上 例 可 以 看 出 ,Java用 break来 实 现g

oto语 句 所 特 有 的 一 些 优 点

。 如 果 break后 所 指 定 的 标 号 不 是 一 个 代 码 块 的 标 号 ,而 是 一 个 ?

句 ,则 这 时 break完 全 实 现

goto的 功 能 。 不 过 应 该 避 免 这 种 方 式 的 使 用 。    (未 完 待 续 )


回主页教程 上一篇 下一篇