欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java?switch?case語(yǔ)句的用法及常見(jiàn)問(wèn)題

 更新時(shí)間:2025年04月25日 08:42:49   作者:小寶哥Code  
這篇文章主要介紹了Java?switch?case語(yǔ)句的用法及常見(jiàn)問(wèn)題,Java中的switch語(yǔ)句是一種多分支選擇結(jié)構(gòu),用于替代多個(gè)if...elseif的情況,它根據(jù)某個(gè)變量的值,執(zhí)行匹配分支中的代碼塊,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

switch 語(yǔ)句是 Java 中一種多分支選擇結(jié)構(gòu),用于替代多個(gè) if...else if 的情況。它根據(jù)某個(gè)變量的值,執(zhí)行匹配分支中的代碼塊。

1. 基本語(yǔ)法

switch (表達(dá)式) {
    case 值1:
        // 當(dāng)表達(dá)式的值等于 值1 時(shí)執(zhí)行的代碼
        break; // 可選,跳出 switch 語(yǔ)句
    case 值2:
        // 當(dāng)表達(dá)式的值等于 值2 時(shí)執(zhí)行的代碼
        break;
    ...
    default:
        // 當(dāng)所有 case 都不匹配時(shí)執(zhí)行的代碼
        break; // 可選
}
  • 表達(dá)式:可以是 byteshort、intchar、String 或枚舉類型(enum)。
  • case:每個(gè)分支的值必須是常量,且值類型必須與表達(dá)式的類型一致。
  • break:用于跳出 switch 語(yǔ)句。若省略 break,程序會(huì)繼續(xù)執(zhí)行下一個(gè) case(稱為switch 穿透)。
  • default:可選,處理所有不匹配的情況,類似 else。

2. 示例代碼

2.1 簡(jiǎn)單的 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 開(kāi)始,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)象

如果分支中沒(méi)有 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)闆](méi)有 break,繼續(xù)執(zhí)行 case 3 和 default。

正確寫(xiě)法:加入 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 開(kāi)始,switch 可以作為表達(dá)式使用,返回一個(gè)值。

語(yǔ)法

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

好處:

  • 簡(jiǎn)化語(yǔ)法,不需要 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. 常見(jiàn)問(wèn)題與注意事項(xiàng)

5.1 忘記 break

  • switch 分支中忘記添加 break 會(huì)導(dǎo)致穿透現(xiàn)象。
  • 如果不需要穿透,務(wù)必在每個(gè) case 分支后添加 break。

5.2 default 的位置

  • default 可以出現(xiàn)在 switch 的任何位置,但通常寫(xiě)在最后,增強(qiáng)可讀性。

5.3 表達(dá)式類型的限制

  • switch 表達(dá)式的類型必須是以下之一:
    • byteshortintchar(以及它們的包裝類)
    • 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ù)類型byteshortintcharString, 枚舉類型(enum)等。
break 和 defaultbreak 用于防止穿透,default 用于處理所有不匹配的情況。
switch 表達(dá)式(Java 12+)簡(jiǎn)化語(yǔ)法,直接返回值,無(wú)需 break,更清晰且簡(jiǎn)潔。
多行代碼塊(Java 13+)使用 yield 返回值,支持多行邏輯處理。
適用場(chǎng)景多值匹配、值相等判斷(如菜單選項(xiàng)、枚舉狀態(tài)、字符串匹配等)。

通過(guò)合理使用 switch 語(yǔ)句,可以讓代碼邏輯更清晰、更高效,尤其是在處理多分支選擇時(shí),是一種非常直觀的解決方案!

我們已經(jīng)詳細(xì)探討了 Java 中 switch case 語(yǔ)句的基礎(chǔ)知識(shí)、進(jìn)階用法和優(yōu)化技巧。在接下來(lái)的部分,我們將進(jìn)一步探討 switch 的高級(jí)特性、性能優(yōu)化、常見(jiàn)問(wèn)題的解決方案 以及 實(shí)踐中的應(yīng)用場(chǎng)景,幫助你更全面地掌握 switch 語(yǔ)句并在實(shí)際開(kāi)發(fā)中高效使用。

7. switch 的高級(jí)特性

7.1 switch 和多值匹配

從 Java 12 開(kāi)始,switch 表達(dá)式支持多值匹配,這大大簡(jiǎn)化了多個(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

好處

  • 使用逗號(hào)分隔多個(gè) case 值,減少代碼冗余。
  • 更清晰地表達(dá)多個(gè)值對(duì)應(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ù)雜場(chǎng)景中,可以使用嵌套的 switch 語(yǔ)句來(lái)處理多層邏輯。

示例:嵌套 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)處理等場(chǎng)景。結(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 的性能對(duì)比

  • 性能
    • 對(duì)于少量條件,switch 和 if...else 性能相差不大。
    • 對(duì)于大量條件,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)象(無(wú)意的 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ā)問(wèn)題

  • switch 不支持直接匹配 null 值,若傳入 null,會(huì)拋出 NullPointerException
  • 解決方案:在使用 switch 前先檢查是否為 null。

9. 實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景

9.1 菜單系統(tǒng)

示例:簡(jiǎn)單菜單系統(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í)行不同的操作。

示例:簡(jiǎn)單狀態(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ò)誤代碼返回對(duì)應(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 適用場(chǎng)景

場(chǎng)景推薦結(jié)構(gòu)
固定值的多分支選擇使用 switch
區(qū)間判斷或復(fù)雜布爾邏輯使用 if...else
需要返回值的選擇結(jié)構(gòu)使用 switch 表達(dá)式(Java 12+)

10.2 最佳實(shí)踐

  • 選擇合適的結(jié)構(gòu):對(duì)于固定值的分支,優(yōu)先使用 switch,尤其是枚舉和字符串匹配。
  • 避免穿透現(xiàn)象:確保每個(gè) case 使用 break 或 return 結(jié)束。
  • 總是提供 default:處理意外情況,增強(qiáng)代碼的魯棒性。
  • 使用 switch 表達(dá)式:在 Java 12+ 中,推薦使用 switch 表達(dá)式簡(jiǎn)化代碼邏輯。
  • 提前處理 null 值:避免因 null 引發(fā) NullPointerException。

通過(guò)合理使用 switch case 語(yǔ)句,不僅可以提升代碼的可讀性和效率,還能更好地應(yīng)對(duì)多條件分支的復(fù)雜場(chǎng)景!

總結(jié)

到此這篇關(guān)于Java switch case語(yǔ)句的用法及常見(jiàn)問(wèn)題的文章就介紹到這了,更多相關(guān)Java switch case語(yǔ)句用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mybatis-plus中的常用注解

    mybatis-plus中的常用注解

    這篇文章主要介紹了mybatis-plus中的常用注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring boot實(shí)現(xiàn)文件上傳功能

    Spring boot實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了Spring boot實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • RocketMQ事務(wù)消息原理與使用詳解

    RocketMQ事務(wù)消息原理與使用詳解

    RocketMQ事務(wù)消息(Transactional Message)是指應(yīng)用本地事務(wù)和發(fā)送消息操作可以被定義到全局事務(wù)中,要么同時(shí)成功,要么同時(shí)失敗。RocketMQ的事務(wù)消息提供類似 X/Open XA 的分布式事務(wù)功能,通過(guò)事務(wù)消息能達(dá)到分布式事務(wù)的最終一致
    2023-02-02
  • 深入了解JAVA HASHMAP的死循環(huán)

    深入了解JAVA HASHMAP的死循環(huán)

    HASHMAP基于哈希表的 Map 接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)下面小編來(lái)帶大家詳細(xì)了解下吧
    2019-06-06
  • 關(guān)于自定義過(guò)濾器獲取不到session問(wèn)題

    關(guān)于自定義過(guò)濾器獲取不到session問(wèn)題

    這篇文章主要介紹了關(guān)于自定義過(guò)濾器獲取不到session問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java編程調(diào)用微信支付功能的方法詳解

    Java編程調(diào)用微信支付功能的方法詳解

    這篇文章主要介紹了Java編程調(diào)用微信支付功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了java微信支付功能的原理、操作流程及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署

    SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署

    spring-boot-devtools是一個(gè)為開(kāi)發(fā)者服務(wù)的一個(gè)模塊,其中最重要的功能就是自動(dòng)應(yīng)用代碼更改到最新的App上面去。,這篇文章主要介紹了SpringBoot項(xiàng)目在IntelliJ IDEA中如何實(shí)現(xiàn)熱部署,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java?spring?mvc請(qǐng)求詳情介紹

    Java?spring?mvc請(qǐng)求詳情介紹

    這篇文章主要介紹了Java?spring?mvc請(qǐng)求詳情,mvc是spring源碼中的一個(gè)子模塊,下文關(guān)于spring?mvc請(qǐng)求的相關(guān)資料做簡(jiǎn)單介紹,需要的小伙伴可以參考一下,希望對(duì)你有所幫助
    2022-03-03
  • 一文掌握J(rèn)ava中的JWT

    一文掌握J(rèn)ava中的JWT

    這篇文章主要介紹了Java中的JWT,JWT的本質(zhì)就是一個(gè)字符串,它是將用戶信息保存到一個(gè)Json字符串中,然后進(jìn)行編碼后得到一個(gè)JWT?token,對(duì)JWT相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-06-06
  • SpringBoot開(kāi)發(fā)存儲(chǔ)服務(wù)器實(shí)現(xiàn)過(guò)程詳解

    SpringBoot開(kāi)發(fā)存儲(chǔ)服務(wù)器實(shí)現(xiàn)過(guò)程詳解

    這篇文章主要為大家介紹了SpringBoot開(kāi)發(fā)存儲(chǔ)服務(wù)器實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論