今天線上有個NullPointerException 的異常,我翻了一下代碼,拋異常的竟然是switch語句 我有種不祥的預感,本地做了實驗 結果是 Java的switch如果傳入null值,會拋出 java.lang.NullPointerException 的異常 看下麵的代碼,不要指望會跳到d ...
今天線上有個NullPointerException 的異常,我翻了一下代碼,拋異常的竟然是switch語句
我有種不祥的預感,本地做了實驗
結果是
Java的switch如果傳入null值,會拋出 java.lang.NullPointerException 的異常
看下麵的代碼,不要指望會跳到default分支,實際情況是在switch語句就拋異常了。
// Java代碼 String s = null; switch (s) { //因為s=null 所以這裡妥妥的會拋異常 case "a": System.out.println("a"); break; default: System.out.println("default"); break; }
但是C#,程式會跳入到default
// C#代碼 String s = null; switch (s) { case "a": Console.WriteLine("a"); break; default: Console.WriteLine("default"); // 在C#中這行代碼會正常輸出 break; }
另外總結一下C#和Java的switch的其他區別
為了防止誤操作,C#如果某個case裡邊有語句,必須也要有break;但是Java沒有這個限制,一直遇到break才退出。
否則會編譯錯誤 Control cannot fall through from one case label ('case "a":') to another
// 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編譯器沒有這個防護措施
// 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,另外枚舉類型也是沒有問題的