今天線上有個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,另外枚舉類型也是沒有問題的