在Java 8的switch语句中,null总是会导致NullPointerException吗



Oracle文档读取

default部分处理未由case部分之一显式处理的所有值。

然而,当我运行以下代码时

Integer i = null;
switch (i) {
case 1:
// ...
break;    
default:
System.out.println("default hit");
}

,抛出了NullPointerExceptionnull是否总是导致抛出NullPointerException,或者它是否有可能击中switch语句中的default标签?我想Java 18之前的任何Java版本也应该如此,其中引入了null匹配。

JLS的相关部分是这样说的:

switch语句是通过首先计算选择器表达式来执行的。然后:

  • […]
  • 否则,如果对选择器表达式求值的结果是null,则抛出NullPointerException,并且整个switch语句因此而突然完成

因此,null值永远不会导致执行default情况(或任何其他情况(。

早些时候,在非规范部分,规范解释道:

null不能用作case常量,因为它不是常量表达式。即使允许case null,也不可取,因为这种情况下的代码永远不会被执行。这是因为,给定引用类型(即String或装箱基元类型或枚举类型(的选择器表达式,如果选择器表达式在运行时计算结果为null,则会发生异常。根据Java编程语言的设计者的判断,传播异常比没有大小写标签匹配或default标签匹配要好

相关内容

  • 没有找到相关文章

最新更新