.Net转Java.04.踩到switch的坑
今天线上有个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,另外枚举类型也是没有问题的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2006-01-09 今天第一次使用Visual Studio 2005
2006-01-09 SQLServer2005 T-SQL 新特性(转载)