惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
GbyAI
GbyAI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
Y
Y Combinator Blog
Recorded Future
Recorded Future
博客园 - Franky
I
InfoQ
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
雷峰网
雷峰网
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Cloudbric
Cloudbric
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Check Point Blog
爱范儿
爱范儿
The GitHub Blog
The GitHub Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
U
Unit 42
N
Netflix TechBlog - Medium
The Cloudflare Blog
Spread Privacy
Spread Privacy
Microsoft Azure Blog
Microsoft Azure Blog
美团技术团队
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
H
Heimdal Security Blog
TaoSecurity Blog
TaoSecurity Blog
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tenable Blog
B
Blog
S
Securelist
H
Hacker News: Front Page
Google Online Security Blog
Google Online Security Blog
G
Google Developers Blog

博客园 - 小墨的童鞋

python计算月份的加减 git操作中出现Unlink of file '......' failed. Should I try again? IDEA建立Spring MVC Hello World 详细入门教程 IDEA手工添加webapp目录 解决错误:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package. IDEA编译时出现 Information:java: javacTask: 源发行版 1.8 需要目标发行版 1.8 发票打印不全不完整的解决方案(Win10) Idea checkstyle插件的使用 .Net转Java.08.format 修复恢复"可疑"的SQLServer数据库 .Net转Java.07.IDEA和VS常用操作、快捷键对照表 .Net转Java.06.字符串的split的区别 .Net转Java.05.为啥MySQL没有nolock .Net转Java.03.受查异常和非受查异常 通过IntelliJ IDEA和Maven命令查看某个jar包是怎么引入的 .Net转Java.02.数据类型 .Net转Java.01.从Main(main)函数说起 IDEA下Maven的Offline Mode 修改Arduino IDE默认字体
.Net转Java.04.踩到switch的坑
小墨的童鞋 · 2018-01-09 · via 博客园 - 小墨的童鞋

今天线上有个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");
        }

这段代码可以正常执行,返回结果是

因为缺少break,导致三个case一个没拉下,全部执行了。。

除非你确实想这样,否则就是个bug了

Java到1.7switch才支持了String类型,1.6仅仅支持char,byte,short,int,另外枚举类型也是没有问题的