第 四 章 流 控 制 郁欣 孙元 王曦东 王克宏 与 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的 功 能 。 不 过 应 该 避 免 这 种 方 式 的 使 用 。 (未 完 待 续 ) |