541
京東網上商城
《Java語言導學(原書第6版)》一一3.4 控製流語句
3.4 控製流語句
源文件中的語句通常按照出現的先後次序自頂向下執行。控製流語句打破了這種常規,它通過決策、循環和分支等,使程序可以有條件地執行特定的代碼塊。本節介紹Java程序語言支持的決策語句(if-then、if-then-else、switch)、循環語句(for、while、do-while)和分支語句(break、continue、return)。
3.4.1 if-then語句和if-then-else語句
1.?if-then語句
if-then語句是最基本的控製流語句。該語句使得當某個條件為真時,程序隻執行特定的代碼段。再以自行車為例來說明。自行車隻有在運動時,Bicycle類才可以使用刹車減速。如下為applyBrakes方法的一種實現:
當條件為假時(也就是說自行車不再運動),就直接跳出if-then語句。
另外,如果then子句隻包含一條語句,那麼一對花括號可以省略:
何時省略花括號取決於編程人員個人的喜好。但是,省略花括號會降低代碼的健壯性。省略花括號後經常會犯一個錯誤,那就是在then子句中添加第二條語句時忘記添加必需的花括號。編譯器不會捕獲該類錯誤,但程序的運行結果是錯的。
2.?if-then-else語句
if-then-else語句在條件為假時提供第二條執行路徑。在applyBrakes方法中使用if-then-else語句執行某個動作,表示在自行車不處於運動狀態時使用刹車產生的動作。在這個例子中,該動作就是輸出錯誤消息語句:
下麵程序中,IfElseDemo根據testscore的值對成績定級:90分及以上為A,80分及以上為B,以此類推。
注意,testscore的值可能同時滿足複合語句“76 >= 70”和“76 >= 60”中的多個表達式。但是,條件一旦滿足,就執行相應的語句(grade='C';)而且不會計算後續條件。
3.4.2 switch語句
與if-then和if-then-else語句不同,switch語句可以包含多條可能的執行路徑。switch語句通常與byte、short、char、int等基本數據類型一起使用,也會與枚舉類型(見第4章)、String類和由某些基本數據類型組成的特殊類(Character、Byte、Short和Integer等,見第9章)一起使用。
下述SwitchDemo程序聲明int類型的變量month,其值表示月份。它根據month的值使用switch語句顯示月份的名稱。
其輸出結果為August。
switch語句的主體叫switch塊。switch塊中的語句可以用一個或多個case標簽或default標簽來標記。switch語句計算其表達式,並執行匹配的case標簽後的所有語句。
該程序的功能也可以用if-then-else語句實現:
選擇if-then-else語句還是switch語句,取決於程序的可讀性和語句的條件表達式。if-then-else語句可以根據值或條件的範圍進行條件判斷,而switch語句隻能根據單個值(如整數、枚舉值、String對象等)進行條件判斷。
需要注意的是break語句,它讓程序跳出switch語句,繼續執行switch塊後的第一條語句。break語句是必需的,如果沒有break語句,switch塊中的語句就會失效:它會順序執行匹配case標簽之後的所有語句,不管是否是表達式的子case標簽,直到遇到break語句。程序SwitchDemoFallThrough就是這樣一個例子,它輸出匹配月份及之後的月份:
就技術而言,最後的break不是必需的,因為控製流會跳出switch語句。但建議使用break,因為這樣有助於更改代碼,而且不容易犯錯誤。default部分處理所有不能用case部分顯式處理的值。
下述SwitchDemo2程序說明語句如何包含多個case標簽,其功能為計算特定月份的天數:
在switch語句中使用String對象
在switch語句的表達式中可以使用String對象。下麵的程序StringSwitchDemo會根據月份的String值來顯示月份的數值:
程序輸出8。
switch表達式中的String對象與case標簽關聯的表達式比較,就像使用String.equals方法一樣。要讓StringSwitchDemo程序接收任意大小寫的月份,隻需將輸入的月份名稱轉換成小寫(使用toLowerCase方法),並將case標簽關聯的所有字符串都改成小寫即可。
注意 這個例子測試switch語句中的表達式是否為null。要確保任意switch語句中的表達式都不為null,以免拋出空指針異常(NullPointerException)。
3.4.3 while語句和do-while語句
當條件為真時,while語句不斷執行語句塊。其語法如下:
while語句先計算expression的值,並返回一個boolean值。如果其值為真,while語句執行while塊中的statement(s)。接著不斷執行while代碼塊,並計算expression的值,直到expression的值為假。使用下述WhileDemo程序可以依次打印1到10的值:
do-while語句和while語句的區別在於do-while在循環的末端計算表達式的值,而不是在頂部。因此,do代碼塊內的語句至少要執行一次,如DoWhileDemo程序所示。
3.4.4 for語句
for語句提供在一定值範圍內迭代的緊湊方式。程序員通常稱為for循環,因為在滿足特定的條件之前,它會一直循環執行。for語句的一般形式如下:
使用這種形式的for語句時,要牢記以下幾點:
initialization表達式初始化循環,它隻在循環開始時執行一次。
當termination表達式的值為false時,循環終止。
循環過程中,每次迭代都會調用increment表達式,該表達式可以對一個值進行遞增或遞減操作。
下述ForDemo程序使用for語句的一般形式將數字1到10顯示到標準輸出上:
注意如何在initialization表達式中聲明變量。變量的作用域為從變量聲明到for語句控製的代碼塊末端,因此它也可以用於termination和increment表達式。如果控製for語句的變量不是循環體外必需的,那麼最好在initialization表達式中聲明該變量。變量名i、j和k通常用於控製for循環,在initialization表達式內聲明這些變量,不僅限製了它們的生命周期,而且會減少錯誤。
for循環的三個表達式都是可選的。無限循環可以如下創建:
for語句還有另一種形式,用於迭代集合和數組中的元素。這種形式有時稱為加強型for語句,主要用於使循環更加緊湊,易於閱讀。下麵舉個例子來說明這一點,數組包含了從1到10的10個數字:
程序EnhancedForDemo使用加強型for語句來循環該數組:
在這個例子中,變量item保存數組numbers的當前值。輸出結果和ForDemo的輸出結果一樣:
建議使用加強型for語句,而不是一般形式的for語句。
3.4.5 分支語句
1.?break語句
break語句有兩種形式:標簽式和非標簽式。非標簽式break語句在switch語句的討論中已經介紹過。如下麵的BreakDemo程序所示,非標簽式break也可以終止for、while或do-while循環:
該程序在數組中搜索數字12。找到12時,break語句(如上述代碼中黑體所示)會終止for循環。控製流會跳轉到for循環後麵的語句。程序輸出結果如下:
非標簽式break語句會終止最內層的switch、for、while或do-while語句,而標簽式break語句會終止外層語句。下麵的BreakWithLabelDemo程序與前述程序類似,隻是使用嵌套循環在二維數組中搜索值。找到該值時,標簽式break語句(標簽式search)會終止外層循環。
break語句會終止標簽語句,但不會改變到標簽語句的控製流。控製流會立即跳轉到標簽語句(已終止)後的語句。
2.?continue語句
continue語句會跳出for、while或do-while循環的當前迭代。非標簽形式會跳轉到最外層循環體的末端,並計算控製該循環的boolean表達式。下麵的ContinueDemo程序逐個統計字符串中字母p的出現次數。如果當前字符不是p,continue語句會跳出循環並繼續測試下一個字符。如果字符是p,將字母個數加1:
刪除continue語句並重新編譯,可以清楚地看到continue語句的作用。運行程序時,計數錯誤,也就是說會搜索到35個p,而不是9個。
標簽式continue語句跳出給定標簽標記的外層循環的當前迭代。下述Continue-
WithLabelDemo程序使用嵌套循環在另一個字符串內搜索子串。需要用到兩個嵌套循環:一個用於迭代待搜索的子串,另一個用於迭代要搜索的字符串。ContinueWithLabelDemo使用標簽式continue語句跳出外層循環的迭代:
3.?return語句
最後一種分支語句是return語句。return語句退出當前方法,且控製流返回到調用方法的位置。return語句有兩種形式:一種返回值,另一種不返回值。要返回值,隻需在return後輸入返回的值或待計算的表達式:
返回值的數據類型必須與方法聲明的返回值的類型匹配。當方法聲明為void類型時,要采用不返回值的return語句:
第4章將介紹編寫方法時所需要的知識。
3.4.6 小結
if-then語句是最基本的控製流語句。該語句使得當某個條件為真時,程序隻執行特定的代碼段。if-then-else語句在條件為假時提供第二條執行路徑。與if-then和if-then-else語句不同,switch語句可以包含多條可能的執行路徑。while和do-while語句當條件為真時可以不斷執行語句塊。do-while語句和while語句的區別在於do-while在循環的末端計算表達式的值,而不是在頂部。因此,do代碼塊內的語句至少執行一次。for語句提供在一定值範圍內迭代的緊湊方式。它有兩種形式,其中一種用於迭代集合和數組中的元素。
3.4.7 問題和練習:控製流語句
問題
1. Java程序語言支持的最基本的控製流語句是 。
2. 語句支持任意數量可能的執行路徑。
3. 語句與while語句類似,但在循環的 計算表達式的值。
4. 如何使用for語句編寫無限循環?
5. 如何使用while語句編寫無限循環?
練習
根據下述代碼段,完成後麵的練習:
a.?想象一下,如果aNumber是3,上述代碼段會輸出什麼結果?
b.?編寫一個測試程序,它包含前麵代碼段,而且aNumber的值為3。程序的輸出結果是
?什麼?輸出結果是否就是預期的結果?解釋原因。換句話說,什麼是該代碼段的控
?製流?
c.隻使用空格和換行符重新排版代碼段,以便理解其控製流結構。
d.使用大括號進一步簡化代碼。
答案
相關答案參考
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/QandE/answers_flow.html。
最後更新:2017-08-21 12:03:01