Oracle文档读取
default
部分处理未由case
部分之一显式处理的所有值。
然而,当我运行以下代码时
Integer i = null;
switch (i) {
case 1:
// ...
break;
default:
System.out.println("default hit");
}
,抛出了NullPointerException
。null
是否总是导致抛出NullPointerException
,或者它是否有可能击中switch
语句中的default
标签?我想Java 18之前的任何Java版本也应该如此,其中引入了null
匹配。
JLS的相关部分是这样说的:
switch语句是通过首先计算选择器表达式来执行的。然后:
- […]
- 否则,如果对选择器表达式求值的结果是
null
,则抛出NullPointerException
,并且整个switch语句因此而突然完成
因此,null
值永远不会导致执行default
情况(或任何其他情况(。
早些时候,在非规范部分,规范解释道:
null
不能用作case
常量,因为它不是常量表达式。即使允许case null
,也不可取,因为这种情况下的代码永远不会被执行。这是因为,给定引用类型(即String
或装箱基元类型或枚举类型(的选择器表达式,如果选择器表达式在运行时计算结果为null
,则会发生异常。根据Java编程语言的设计者的判断,传播异常比没有大小写标签匹配或default
标签匹配要好