與 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,否 則 執 行 st atement2。
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整 除 ,但 不 能 被 10 0整 除 ;② 能 被 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("
** 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("
** 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("
** 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