第06部分:條件判斷語句

if/else語句

if 語句是基本的控制語句,允許 Java 作出判斷,或者更準(zhǔn)確地說,根據(jù)條件決定執(zhí)行哪些語句。if 語句有關(guān)聯(lián)的表達式和語句,如果表達式的計算結(jié)果為 true,解釋器會執(zhí)行關(guān)聯(lián)的語句;如果表達式的計算結(jié)果為 false,解釋器會跳過關(guān)聯(lián)的語句。


Java 允許在關(guān)聯(lián)的表達式中使用包裝類型 Boolean 代替基本類型 boolean。此時,包裝對象會自動拆包。


下面是一個 if 語句示例:

if (username == null)? ? ? ? ? ? ? ? ? ? ?// 如果username的值是null

????????username = "John Doe";? ? ? // 使用默認值

雖然括號看起來不重要,但卻是 if 語句句法不可缺少的一部分。前面說過,花括號中的語句塊本身也是語句,所以 if 語句還可以寫成這樣:

if ((address == null) || (address.equals(""))) {

????????address = "[undefined]";

????????System.out.println("WARNING: no address specified.");

}



if 語句可以包含一個可選的 else 關(guān)鍵字,并在后面跟著另一個語句。在這種形式中,如果表達式的計算結(jié)果為 true,會執(zhí)行第一個語句,否則執(zhí)行第二個語句。例如:

if (username != null)

????????System.out.println("Hello " + username);

else {

????????username = askQuestion("What is your name?");

????????System.out.println("Hello " + username + ". Welcome!");

}


嵌套使用 if/else 語句時要注意,必須確保 else 子句和正確的 if 語句匹配。例如下面的代碼就是錯誤的:

if (i == j)

????????if (j == k)

? ? ? ? ????????System.out.println("i equals k");

else

????????System.out.println("i doesn't equal j");

在這個例子中,根據(jù)句法,內(nèi)層 if 語句是外層 if 語句的單個語句。但是,(除了縮進給出的提示)else 子句和哪個 if 語句匹配并不明確。而且,這個例子的縮進提示也是錯的。規(guī)則是這樣的,else 子句和最近的 if 語句關(guān)聯(lián)。下面的代碼縮進正確:

if (i == j)

????????if (j == k)

? ? ? ? ? ????????System.out.println("i equals k");

????????else

????????????????System.out.println("i doesn't equal j");?

這是合法的代碼,但顯然沒有清楚表明程序員的意圖。使用嵌套 if 語句時,應(yīng)該使用花括號,讓代碼更易讀。下面是這個示例更好的編寫方式:

if (i == j) {

????????if (j == k){

? ???????????????System.out.println("i equals k");

????????}

}else {

????????System.out.println("i doesn't equal j");

}


if/else 語句適用于測試一個條件,并在兩個語句或代碼塊中選擇一個執(zhí)行。那么需要在多個代碼塊中選擇時怎么辦呢?這種情況一般使用 else if 子句。這其實不是新句法,而是標(biāo)準(zhǔn) if/else 語句的慣用句法。用法如下:

if (n == 1) {

????????//執(zhí)行代碼塊#1

}else if (n == 2) {

????????// 執(zhí)行代碼塊#2

}else if ( n== 3) {

????????// 執(zhí)行代碼塊#3

}else {

????????// 如果前面的條件判斷都失敗,執(zhí)行代碼塊#4

}

這段代碼沒什么特別,只是一系列 if 語句,其中各 if 語句是前一個語句 else 子句的一部分。較之完全使用嵌套的形式(如下所示,不推薦使用),更推薦使用 else if:

if (n == 1) {

????????//執(zhí)行代碼塊#1

}else {

????????if (n== 2) {

????????????????//執(zhí)行代碼塊#2

????????}else {

????????????????if (n == 3) {

????????????????????????//執(zhí)行代碼塊#3

????????????????}else {

????????????????????????// 如果前面的條件判斷都失敗,執(zhí)行代碼塊#4

????????????????}

????????}

}





switch語句

if 語句在程序的執(zhí)行過程中創(chuàng)建一個分支。如前一節(jié)所述,可以使用多個 if 語句創(chuàng)建多個分支。但這么做并不總是最好的方式,尤其是所有分支都判斷同一個變量的值時,在多個 if 語句中重復(fù)檢查這個變量的值效率不高。


更好的方式是使用從 C 語言繼承而來的 switch 語句。雖然這種語句的句法沒有 Java 中其他語句優(yōu)雅,但是鑒于它的實用性,還是值得使用。


switch 語句以一個表達式開始,這個表達式的返回值是 int、short、char、byte(或這四個類型的包裝類型)、String 或枚舉類型。


這個表達式后面跟著一段放在花括號里的代碼,這段代碼中有多個入口點,對應(yīng)于表達式各個可能的返回值。例如,下面的 switch 語句等效于上面的的多個 if 和 else/if 語句:

switch(n){

? ? ? ? case? 1:? ? ?// 如果n == 1,從這開始

? ? ? ? ? ? ? ? //執(zhí)行代碼塊1

? ? ? ? ? ? ? ? break;? ? ?// 在這停止

? ? ? ? case? 2:? ? ?// 如果n == 2,從這開始

????????????????//執(zhí)行代碼塊2

? ? ? ? ? ? ? ? break;? ? ?// 在這停止

? ? ? ? case? 3:? ? ?// 如果n == 3,從這開始

????????????????//執(zhí)行代碼塊3

? ? ? ? ? ? ? ? break;? ? ?// 在這停止

? ? ? ? default:? ? ?// 如果前面的條件判斷都失敗了......? 從這里開始

????????????????//執(zhí)行代碼塊4

? ? ? ? ? ? ? ? break;? ? ?// 在這停止

}

從這個示例可以看出,switch 語句中的各入口點有兩種形式:一種使用關(guān)鍵字 case 標(biāo)注,后面跟著一個整數(shù)和一個冒號;另一種使用特殊的關(guān)鍵字 default 標(biāo)注,后面跟著一個冒號。解釋器執(zhí)行 switch 語句時,先計算括號中表達式的值,然后查找有沒有匹配這個值的case 標(biāo)注。如果有,解釋器就從這個 case 標(biāo)注后的代碼塊中第一個語句開始執(zhí)行;如果沒有,解釋器從特殊的 default 標(biāo)注后的代碼塊中第一個語句開始執(zhí)行;如果沒有 default標(biāo)注,解釋器會跳過整個 switch 語句主體。



注意,在前面的代碼中每個 case 子句末尾都有 break 關(guān)鍵字。后面會介紹 break 語句,這里,它的作用是讓解釋器退出 switch 語句的主體。switch 語句中的 case 子句只用來指定需要執(zhí)行的代碼起始點,各 case 子句后的代碼塊不是相互獨立的,沒有任何隱式的結(jié)束點。因此,必須使用 break 或相關(guān)的語句明確指定各 case 子句在哪里結(jié)束。如果沒有break 語句,switch 語句會從匹配的 case 標(biāo)注后第一個語句開始執(zhí)行,一直到代碼塊結(jié)束為止。極少數(shù)的情況下會這樣編寫代碼,從一個 case 標(biāo)注執(zhí)行到下一個 case 標(biāo)注;99%的情況下都要在每個 case 和 default 子句中加上一個語句,結(jié)束執(zhí)行 switch 語句。一般情況下使用 break 語句,不過 return 和 throw 語句也行。


switch 語句可以使用多個 case 子句標(biāo)注同一個希望執(zhí)行的語句。例如下面這個方法中的switch 語句:

boolean? ?parseYesOrNoResponse(char response) {

????????switch(response) {

????????????????case 'y':

????????????????case 'Y':?

????????????????????????return true;

????????????????case 'n':

????????????????case 'N':?

????????????????????????return false;

????????????????default:

????????????????????????throw new IllegalArgumentException("Response must be Y or N");

? ? ? ? }

}

switch 語句和 case 標(biāo)注有些重要的限制。首先,switch 語句關(guān)聯(lián)的表達式必須是適當(dāng)?shù)念愋?,可以?byte、char、short、int(及這四種類型的包裝類型)、枚舉類型或 String類型,不支持浮點數(shù)和布爾類型,雖然 long 也是整數(shù)類型,但也不能使用。其次,各case 標(biāo)注關(guān)聯(lián)的值必須是編譯器能計算的常量或常量表達式。case 標(biāo)注不能包含運行時表達式,例如變量或方法調(diào)用。再者,case 標(biāo)注中的值必須在 switch 表達式返回值對應(yīng)數(shù)據(jù)類型的取值范圍內(nèi)。最后,不能有兩個或多個 case 標(biāo)注使用同一個值,而且 default 標(biāo)注不能超過一個。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容