.Net轉Java.04.踩到switch的坑

今天線上有個NullPointerException 的異常,我翻了一下代碼,拋異常的居然是switch語句java

我有種不祥的預感,本地作了實驗spa

結果是code

Java的switch若是傳入null值,會拋出 java.lang.NullPointerException 的異常blog

看下面的代碼,不要期望會跳到default分支,實際狀況是在switch語句就拋異常了。編譯器

        // Java代碼
        String s = null;
        switch (s) { //由於s=null 因此這裏妥妥的會拋異常
            case "a":
                System.out.println("a");
                break;
            default:
                System.out.println("default");
                break;
        }

可是C#,程序會跳入到defaultit

            // C#代碼
            String s = null;
            switch (s)
            {
                case "a":
                    Console.WriteLine("a");
                    break;
                default:
                    Console.WriteLine("default"); // 在C#中這行代碼會正常輸出
                    break;
            }

 

另外總結一下C#和Java的switch的其餘區別io

爲了防止誤操做,C#若是某個case裏邊有語句,必須也要有break;可是Java沒有這個限制,一直遇到break才退出。編譯

不然會編譯錯誤  Control cannot fall through from one case label ('case "a":') to anotherclass

            // C#代碼
            switch (s)
            {
                case "a": // 這個地方編譯失敗 由於a下面有一個語句 Console.WriteLine("a");
                    Console.WriteLine("a");
                case "b": // 這個地方能夠編譯經過,b下面沒有語句
                case "c":
                    Console.WriteLine("b or c");
                    break;
                default:
                    Console.WriteLine("default");
                    break;
            }

可是Java編譯器沒有這個防禦措施bug

        // Java代碼
        String s = "a";
        switch (s) {
            case "a":
                System.out.println("a");
            case "b":
                System.out.println("b");
            default:
                System.out.println("default");
        }

這段代碼能夠正常執行,返回結果是

a
b
default

由於缺乏break,致使三個case一個沒拉下,所有執行了。。

除非你確實想這樣,不然就是個bug了

Java到1.7switch才支持了String類型,1.6僅僅支持char,byte,short,int,另外枚舉類型也是沒有問題的

相關文章
相關標籤/搜索