null 总是会导致 Java 8 的 switch 语句出现 NullPointerException 吗?

Will null always cause NullPointerException in switch statement in Java 8?

提问人:banan3'14 提问时间:11/4/2022 最后编辑:oguz ismailbanan3'14 更新时间:11/5/2022 访问量:61

问:

Oracle 文档读取

该部分处理其中一个部分未显式处理的所有值。defaultcase

但是,当我运行以下代码时

Integer i = null;

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

,被抛出。总是会导致被抛出,或者它是否有可能在声明中击中标签?我想 Java 18 之前的任何 Java 版本也应该如此,其中引入了匹配。NullPointerExceptionnullNullPointerExceptiondefaultswitchnull

java-8 nullpointerexception null 开关语句

评论

0赞 Joachim Sauer 11/4/2022
当你尝试它时发生了什么?
0赞 Alexander Ivanchenko 11/4/2022
尝试执行拆箱时会失败。否则也行不通。Stringenum
0赞 banan3'14 11/4/2022
当我尝试它时,我得到了 NullPointerException
0赞 Joachim Sauer 11/4/2022
如果你知道你的问题的答案是“否”,那么为什么不重新表述你的问题呢?;-)
1赞 banan3'14 11/4/2022
@JoachimSauer,我把它改写:P

答:

2赞 Joachim Sauer 11/4/2022 #1

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

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

  • [...]
  • 否则,如果计算选择器表达式的结果是 ,则抛出 a,并且由于这个原因,整个 switch 语句会突然完成。nullNullPointerException

因此,值永远不会导致事例(或任何其他事例)被执行。nulldefault

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

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