BBS水木清华站∶精华区

发信人: FrankCH (小花花), 信区: Java 
标  题: Java教程(五) 
发信站: BBS 水木清华站 (Sun Jul 27 12:10:29 1997) 
 
 
                                   第 四 章   流 控 制  
 
                                   郁欣 孙元 王曦东 王克宏  
 
 
 
     与 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的 功 能 。 不 过 应 该 避 免 这 种 方 式 的 使 用 。    (未 完 待 续 )  
 
 
-- 
           ^_^ ^_^ ^_^ ^_^ ^_^ ^_^^_^ ^_^ ^_^ ^_^ ^_^ ^_^^_^ ^_^ ^_^ ^_^ ^_^ ^_^^_^ ^_^ ^_^ ^_^ ^_^ ^_^^_^ ^_^ ^_^ ^_^ ^_^ ^_^^_^ ^_^ ^_^ ^_^ ^_^ ^_^ 
^_^ ^_^ ^_^ ^_^ ^_^ ^_^ [s[4;65HO[3;66HO[3;67HO[3;68HO[4;69HO[5;69HO[6;68HO[7;67HO[8;65HO[7;63HO[6;62HO[5;61HO[4;61HO[3;62HO[3;63HO[3;64HO[u 
              Welcome EveryOne! 
 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.74.158] 

BBS水木清华站∶精华区