1. 前言
想像一下:你正在為一家咖啡店寫程式。使用者可以選擇飲品,而你需要對這個選擇做出回應。當然可以使用一大堆 if-else if-else,但看起來並不理想:
if (choice == 1)
{
System.out.println("你選擇了濃縮咖啡。");
}
else if (choice == 2)
{
System.out.println("你選擇了卡布奇諾。");
}
else if (choice == 3)
{
System.out.println("你選擇了拿鐵。");
}
else
{
System.out.println("沒有這種飲品。");
}
是不是很笨重?如果選項有 10 或 20 個呢?這時就能用 switch 運算子幫忙,讓你能根據變數的值,以優雅而精簡的方式在多個選項中做選擇。
傳統 switch 的語法
switch 在 Java 中的語法如下:
switch (vyrazhenie)
{
case znachenie1:
// 當 vyrazhenie == znachenie1 時要執行的動作
break;
case znachenie2:
// 當 vyrazhenie == znachenie2 時要執行的動作
break;
...
default:
// 若沒有與任何 case 相符時要執行的動作
break;
}
switch 運算子的語法
關鍵元素:
- switch (表達式) — 將該表達式的結果與每個 case 比較。
- case 值: — 用來與表達式比對的分支。
- break; — 結束 switch 區塊的執行(否則會「落入」下一個 case)。
- default: — 當沒有任何 case 相符時執行。
2. switch 的使用範例
範例 1:經典——選擇飲品
我們來實作一個咖啡店選單:
import java.util.Scanner;
public class CoffeeShop
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("請選擇飲品:");
System.out.println("1 - 濃縮咖啡");
System.out.println("2 - 卡布奇諾");
System.out.println("3 - 拿鐵");
int choice = console.nextInt();
switch (choice)
{
case 1:
System.out.println("你選擇了濃縮咖啡。");
break;
case 2:
System.out.println("你選擇了卡布奇諾。");
break;
case 3:
System.out.println("你選擇了拿鐵。");
break;
default:
System.out.println("沒有這種飲品。");
break;
}
}
}
會發生什麼事:
- 使用者輸入飲品的編號。
- 變數 choice 的值會與每個 case 比較。
- 若相符 — 執行對應區塊,之後由 break 結束 switch 的執行。
- 若沒有任何相符 — 執行 default。
範例 2:以字串切換
能在 switch 中使用的型別不多,但字串——可以!這對於命令選單很方便:
import java.util.Scanner;
public class CommandMenu
{
public static void main(String[] args)
{
Scanner console = new Scanner(System.in);
System.out.println("請輸入指令 (start, stop, pause):");
String command = console.nextLine();
switch (command)
{
case "start":
System.out.println("啟動程式!");
break;
case "stop":
System.out.println("停止程式。");
break;
case "pause":
System.out.println("暫停。");
break;
default:
System.out.println("未知的指令。");
break;
}
}
}
請注意: 在 switch 中比較字串時會區分大小寫!"Start" 與 "start" 是不同的字串。
3. 傳統 switch 支援哪些型別?
在傳統 switch 中,只能使用特定型別:
- 原始整數型別: byte、short、char、int
- 列舉: enum(下節課會談)
- 字串: String — 比較時區分大小寫
不可 使用:boolean、float、double、陣列、任意類別的物件(除了 enum 與 String)。
以 char 為例
char grade = 'B';
switch (grade)
{
case 'A':
System.out.println("太棒了!");
break;
case 'B':
System.out.println("不錯。");
break;
case 'C':
System.out.println("尚可。");
break;
default:
System.out.println("請再試一次。");
break;
}
4. break 的必要性:如果忘記會怎樣?
新手最常見的錯誤——忘了寫 break;。來看看會發生什麼:
int day = 2;
switch (day)
{
case 1:
System.out.println("週一");
break;
case 2:
System.out.println("週二");
case 3:
System.out.println("週三");
break;
default:
System.out.println("未知的星期");
break;
}
結果:
週二
週三
為什麼?因為在 case 2 之後沒有 break,執行便會「落入」下一個 case(這稱為 fall-through)。有時候這很有用,但多半是錯誤。
5. 群組化 case:當多個選項行為相同
若多個值需要相同的行為,可以把它們連續寫在一起:
int month = 1;
switch (month)
{
case 12:
case 1:
case 2:
System.out.println("冬天");
break;
case 3:
case 4:
case 5:
System.out.println("春天");
break;
case 6:
case 7:
case 8:
System.out.println("夏天");
break;
case 9:
case 10:
case 11:
System.out.println("秋天");
break;
default:
System.out.println("未知的月份");
break;
}
這裡: 如果 month 是 12、1 或 2,程式會輸出 "冬天"。
6. 比較:switch 與 if-else
| 情境 | if-else | switch |
|---|---|---|
| 選項很多 | 冗長的鏈結,較難閱讀 | 簡潔,所有選項一目了然 |
| 區間比較 | 可以使用(if (x > 5 && x < 10)) | 不行,只能是具體值 |
| 支援的型別 | 任何型別 | 僅特定型別(見上文) |
| 與 break 相關的陷阱 | 沒有 | 有,務必留意 break |
7. 使用 switch 的常見錯誤
錯誤一:忘了寫 break
最常見的問題:漏掉 break,導致程式執行到你未預期的 case。
錯誤二:不支援的型別
嘗試使用 double、float 或 boolean —— 編譯器會說「不可以」。
錯誤三:大小寫不同的字串
使用者輸入了 "Start",但你期望 "start" —— switch 不會匹配。最好先把字串統一為同一種大小寫:
switch (command.toLowerCase())
{
case "start":
// ...
}
錯誤四:在 case 中使用變數,而非常數
在 case 中只允許常數。若使用變數——會出現編譯錯誤。
錯誤五:重複的 case
兩個相同的 case 值——編譯器不會放過。
GO TO FULL VERSION