今天线上有个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,另外枚举类型也是没有问题的