Java?switch?case語句的用法及常見問題
switch 語句是 Java 中一種多分支選擇結(jié)構(gòu),用于替代多個(gè) if...else if 的情況。它根據(jù)某個(gè)變量的值,執(zhí)行匹配分支中的代碼塊。
1. 基本語法
switch (表達(dá)式) {
case 值1:
// 當(dāng)表達(dá)式的值等于 值1 時(shí)執(zhí)行的代碼
break; // 可選,跳出 switch 語句
case 值2:
// 當(dāng)表達(dá)式的值等于 值2 時(shí)執(zhí)行的代碼
break;
...
default:
// 當(dāng)所有 case 都不匹配時(shí)執(zhí)行的代碼
break; // 可選
}
- 表達(dá)式:可以是
byte、short、int、char、String或枚舉類型(enum)。 - case:每個(gè)分支的值必須是常量,且值類型必須與表達(dá)式的類型一致。
- break:用于跳出
switch語句。若省略break,程序會(huì)繼續(xù)執(zhí)行下一個(gè)case(稱為switch 穿透)。 - default:可選,處理所有不匹配的情況,類似
else。
2. 示例代碼
2.1 簡單的 switch 示例
public class Main {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1:
System.out.println("Monday");
break;
case 2:
System.out.println("Tuesday");
break;
case 3:
System.out.println("Wednesday");
break;
case 4:
System.out.println("Thursday");
break;
case 5:
System.out.println("Friday");
break;
default:
System.out.println("Weekend");
}
}
}
輸出:
Wednesday
2.2 使用 String 類型的 switch
從 Java 7 開始,switch 支持 String 類型。
public class Main {
public static void main(String[] args) {
String color = "Red";
switch (color) {
case "Red":
System.out.println("Stop!");
break;
case "Yellow":
System.out.println("Caution!");
break;
case "Green":
System.out.println("Go!");
break;
default:
System.out.println("Invalid color.");
}
}
}
輸出:
Stop!
2.3 使用枚舉類型的 switch
switch 可以和 enum 類型結(jié)合使用,這在處理固定集合的值時(shí)非常有用。
public class Main {
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static void main(String[] args) {
Day today = Day.FRIDAY;
switch (today) {
case MONDAY:
System.out.println("Start of the week.");
break;
case FRIDAY:
System.out.println("End of the work week.");
break;
case SATURDAY:
case SUNDAY:
System.out.println("It's the weekend!");
break;
default:
System.out.println("Midweek day.");
}
}
}
輸出:
End of the work week.
2.4 多個(gè) case 合并
多個(gè) case 分支可以合并處理,避免重復(fù)代碼。
public class Main {
public static void main(String[] args) {
int month = 7;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("Winter");
break;
case 3:
case 4:
case 5:
System.out.println("Spring");
break;
case 6:
case 7:
case 8:
System.out.println("Summer");
break;
case 9:
case 10:
case 11:
System.out.println("Autumn");
break;
default:
System.out.println("Invalid month");
}
}
}
輸出:
Summer
3. switch 穿透現(xiàn)象
如果分支中沒有 break,程序會(huì)繼續(xù)執(zhí)行后續(xù)的分支代碼,直到遇到 break 或 switch 結(jié)束。
示例:演示穿透
public class Main {
public static void main(String[] args) {
int number = 2;
switch (number) {
case 1:
System.out.println("One");
case 2:
System.out.println("Two");
case 3:
System.out.println("Three");
default:
System.out.println("Default");
}
}
}
輸出:
Two
Three
Default
分析:
number等于2,匹配到case 2,執(zhí)行其代碼。- 因?yàn)闆]有
break,繼續(xù)執(zhí)行case 3和default。
正確寫法:加入 break
public class Main {
public static void main(String[] args) {
int number = 2;
switch (number) {
case 1:
System.out.println("One");
break;
case 2:
System.out.println("Two");
break;
case 3:
System.out.println("Three");
break;
default:
System.out.println("Default");
}
}
}
輸出:
Two
4. switch 的進(jìn)階用法
4.1 switch 表達(dá)式(Java 12+)
從 Java 12 開始,switch 可以作為表達(dá)式使用,返回一個(gè)值。
語法
int result = switch (表達(dá)式) {
case 值1 -> 值1的結(jié)果;
case 值2 -> 值2的結(jié)果;
default -> 默認(rèn)結(jié)果;
};
示例:返回值
public class Main {
public static void main(String[] args) {
int day = 5;
String result = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6, 7 -> "Weekend";
default -> "Invalid day";
};
System.out.println(result);
}
}
輸出:
Friday
好處:
- 簡化語法,不需要
break。 - 減少冗余代碼。
4.2 多行代碼塊(Java 13+)
在 Java 13 中,switch 表達(dá)式支持多行代碼塊。
示例:多行代碼塊
public class Main {
public static void main(String[] args) {
int day = 5;
String result = switch (day) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 5 -> {
System.out.println("More logic for Friday...");
yield "Friday"; // 使用 yield 返回值
}
default -> "Invalid day";
};
System.out.println(result);
}
}
輸出:
More logic for Friday...
Friday
5. 常見問題與注意事項(xiàng)
5.1 忘記 break
switch分支中忘記添加break會(huì)導(dǎo)致穿透現(xiàn)象。- 如果不需要穿透,務(wù)必在每個(gè)
case分支后添加break。
5.2 default 的位置
default可以出現(xiàn)在switch的任何位置,但通常寫在最后,增強(qiáng)可讀性。
5.3 表達(dá)式類型的限制
switch表達(dá)式的類型必須是以下之一:byte,short,int,char(以及它們的包裝類)String- 枚舉類型(
enum)
5.4 處理 NullPointerException
如果 switch 表達(dá)式為 null 且類型為 String,會(huì)拋出 NullPointerException。
錯(cuò)誤示例
public class Main {
public static void main(String[] args) {
String color = null;
switch (color) { // 會(huì)拋出 NullPointerException
case "Red":
System.out.println("Stop");
break;
default:
System.out.println("Invalid color");
}
}
}
解決方法
在使用 switch 之前,先檢查是否為 null。
if (color == null) {
System.out.println("Invalid color");
} else {
switch (color) {
case "Red":
System.out.println("Stop");
break;
default:
System.out.println("Invalid color");
}
}
6. 總結(jié)
| 特性 | 描述 |
|---|---|
| switch 支持的數(shù)據(jù)類型 | byte, short, int, char, String, 枚舉類型(enum)等。 |
| break 和 default | break 用于防止穿透,default 用于處理所有不匹配的情況。 |
| switch 表達(dá)式(Java 12+) | 簡化語法,直接返回值,無需 break,更清晰且簡潔。 |
| 多行代碼塊(Java 13+) | 使用 yield 返回值,支持多行邏輯處理。 |
| 適用場景 | 多值匹配、值相等判斷(如菜單選項(xiàng)、枚舉狀態(tài)、字符串匹配等)。 |
通過合理使用 switch 語句,可以讓代碼邏輯更清晰、更高效,尤其是在處理多分支選擇時(shí),是一種非常直觀的解決方案!
我們已經(jīng)詳細(xì)探討了 Java 中 switch case 語句的基礎(chǔ)知識(shí)、進(jìn)階用法和優(yōu)化技巧。在接下來的部分,我們將進(jìn)一步探討 switch 的高級特性、性能優(yōu)化、常見問題的解決方案 以及 實(shí)踐中的應(yīng)用場景,幫助你更全面地掌握 switch 語句并在實(shí)際開發(fā)中高效使用。
7. switch 的高級特性
7.1 switch 和多值匹配
從 Java 12 開始,switch 表達(dá)式支持多值匹配,這大大簡化了多個(gè) case 之間的邏輯。
示例:多個(gè) case 匹配相同邏輯
public class Main {
public static void main(String[] args) {
int day = 6;
String result = switch (day) {
case 1, 2, 3, 4, 5 -> "Weekday";
case 6, 7 -> "Weekend";
default -> "Invalid day";
};
System.out.println(result);
}
}
輸出:
Weekend
好處:
- 使用逗號分隔多個(gè)
case值,減少代碼冗余。 - 更清晰地表達(dá)多個(gè)值對應(yīng)相同邏輯的意圖。
7.2 yield 的使用
在 Java 13 中,switch 表達(dá)式引入了 yield 關(guān)鍵字,用于返回計(jì)算結(jié)果。它可以支持多行的邏輯處理,并返回一個(gè)值。
多行邏輯的 yield 示例
public class Main {
public static void main(String[] args) {
int number = 2;
String result = switch (number) {
case 1 -> "One";
case 2 -> {
System.out.println("Processing case 2...");
yield "Two"; // 返回值
}
case 3 -> "Three";
default -> "Unknown";
};
System.out.println("Result: " + result);
}
}
輸出:
Processing case 2...
Result: Two
分析:
yield替代了return,用于switch表達(dá)式中返回值。- 支持多行代碼邏輯,增強(qiáng)了可讀性和靈活性。
7.3 switch 的嵌套
在一些復(fù)雜場景中,可以使用嵌套的 switch 語句來處理多層邏輯。
示例:嵌套 switch 實(shí)現(xiàn)多條件判斷
public class Main {
public static void main(String[] args) {
String role = "Manager";
String department = "HR";
switch (role) {
case "Manager":
switch (department) {
case "HR":
System.out.println("HR Manager");
break;
case "IT":
System.out.println("IT Manager");
break;
default:
System.out.println("General Manager");
}
break;
case "Employee":
System.out.println("Employee");
break;
default:
System.out.println("Unknown role");
}
}
}
輸出:
HR Manager
7.4 使用 switch 處理復(fù)雜邏輯
switch 常用于處理預(yù)定義的條件、菜單選項(xiàng)、狀態(tài)處理等場景。結(jié)合方法和枚舉,可以進(jìn)一步提高可讀性和靈活性。
示例:結(jié)合枚舉和方法處理狀態(tài)
public class Main {
public enum OrderStatus {
PENDING, PROCESSING, COMPLETED, CANCELED
}
public static void main(String[] args) {
OrderStatus status = OrderStatus.PROCESSING;
String message = processOrderStatus(status);
System.out.println(message);
}
public static String processOrderStatus(OrderStatus status) {
return switch (status) {
case PENDING -> "Your order is pending.";
case PROCESSING -> "Your order is being processed.";
case COMPLETED -> "Your order has been completed.";
case CANCELED -> "Your order has been canceled.";
};
}
}
輸出:
Your order is being processed.
8. 性能優(yōu)化與注意事項(xiàng)
8.1 switch 與 if...else 的性能對比
- 性能:
- 對于少量條件,
switch和if...else性能相差不大。 - 對于大量條件,
switch通常比if...else更高效,因?yàn)榫幾g器會(huì)優(yōu)化switch為跳轉(zhuǎn)表(jump table)或二分查找(binary search)。
- 對于少量條件,
- 可讀性:
switch更適合處理固定值的分支選擇。if...else更適合處理復(fù)雜的布爾表達(dá)式或區(qū)間判斷。
示例:區(qū)間判斷更適合使用 if...else
public class Main {
public static void main(String[] args) {
int score = 85;
if (score >= 90) {
System.out.println("Grade: A");
} else if (score >= 80) {
System.out.println("Grade: B");
} else if (score >= 70) {
System.out.println("Grade: C");
} else {
System.out.println("Grade: F");
}
}
}
8.2 避免穿透現(xiàn)象(無意的 fall-through)
- 未添加
break會(huì)導(dǎo)致意外的穿透現(xiàn)象,執(zhí)行后續(xù)的case代碼。 - 解決方法:確保每個(gè)
case分支以break或return結(jié)束,或者使用switch表達(dá)式(Java 12+),該表達(dá)式默認(rèn)不會(huì)穿透。
8.3 default 的使用
- 建議:始終提供
default分支,即使你認(rèn)為所有可能的值都已涵蓋。 - 作用:處理意外值,避免程序出現(xiàn)邏輯漏洞。
8.4 避免 null 值引發(fā)問題
switch不支持直接匹配null值,若傳入null,會(huì)拋出NullPointerException。- 解決方案:在使用
switch前先檢查是否為null。
9. 實(shí)際開發(fā)中的應(yīng)用場景
9.1 菜單系統(tǒng)
示例:簡單菜單系統(tǒng)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("Menu:");
System.out.println("1. Start Game");
System.out.println("2. Load Game");
System.out.println("3. Exit");
System.out.print("Enter your choice: ");
int choice = scanner.nextInt();
switch (choice) {
case 1 -> System.out.println("Game Started!");
case 2 -> System.out.println("Game Loaded!");
case 3 -> System.out.println("Exiting...");
default -> System.out.println("Invalid choice!");
}
}
}
9.2 狀態(tài)機(jī)
switch 非常適合實(shí)現(xiàn)狀態(tài)機(jī),用于根據(jù)當(dāng)前狀態(tài)執(zhí)行不同的操作。
示例:簡單狀態(tài)機(jī)
public class Main {
public enum Light {
RED, YELLOW, GREEN
}
public static void main(String[] args) {
Light current = Light.RED;
switch (current) {
case RED -> System.out.println("Stop!");
case YELLOW -> System.out.println("Ready!");
case GREEN -> System.out.println("Go!");
}
}
}
9.3 錯(cuò)誤代碼處理
switch 可以用于根據(jù)錯(cuò)誤代碼返回對應(yīng)的錯(cuò)誤信息。
示例:根據(jù)錯(cuò)誤代碼提示信息
public class Main {
public static void main(String[] args) {
int errorCode = 404;
String message = switch (errorCode) {
case 200 -> "OK";
case 400 -> "Bad Request";
case 404 -> "Not Found";
case 500 -> "Internal Server Error";
default -> "Unknown Error";
};
System.out.println("Error: " + message);
}
}
10. 總結(jié)與建議
10.1 適用場景
| 場景 | 推薦結(jié)構(gòu) |
|---|---|
| 固定值的多分支選擇 | 使用 switch |
| 區(qū)間判斷或復(fù)雜布爾邏輯 | 使用 if...else |
| 需要返回值的選擇結(jié)構(gòu) | 使用 switch 表達(dá)式(Java 12+) |
10.2 最佳實(shí)踐
- 選擇合適的結(jié)構(gòu):對于固定值的分支,優(yōu)先使用
switch,尤其是枚舉和字符串匹配。 - 避免穿透現(xiàn)象:確保每個(gè)
case使用break或return結(jié)束。 - 總是提供
default:處理意外情況,增強(qiáng)代碼的魯棒性。 - 使用
switch表達(dá)式:在 Java 12+ 中,推薦使用switch表達(dá)式簡化代碼邏輯。 - 提前處理
null值:避免因null引發(fā)NullPointerException。
通過合理使用 switch case 語句,不僅可以提升代碼的可讀性和效率,還能更好地應(yīng)對多條件分支的復(fù)雜場景!
總結(jié)
到此這篇關(guān)于Java switch case語句的用法及常見問題的文章就介紹到這了,更多相關(guān)Java switch case語句用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring boot實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了Spring boot實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署
spring-boot-devtools是一個(gè)為開發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。,這篇文章主要介紹了SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署,感興趣的小伙伴們可以參考一下2018-07-07
SpringBoot開發(fā)存儲(chǔ)服務(wù)器實(shí)現(xiàn)過程詳解
這篇文章主要為大家介紹了SpringBoot開發(fā)存儲(chǔ)服務(wù)器實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

