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

java

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

以上是 .Net转Java.04.踩到switch的坑 的全部内容, 来源链接: utcz.com/z/393261.html

回到顶部