当前位置: 首页 > 面试题库 >

为什么String switch语句不支持null大小写?

卢健
2023-03-14
问题内容

我只是想知道为什么Java 7
switch语句不支持null大小写而是抛出NullPointerException?请参见下面的注释行(示例摘自上的Java教程文章switch):

{
    String month = null;
    switch (month) {
        case "january":
            monthNumber = 1;
            break;
        case "february":
            monthNumber = 2;
            break;
        case "march":
            monthNumber = 3;
            break;
        //case null:
        default: 
            monthNumber = 0;
            break;
    }

    return monthNumber;
}

这样可以避免if每次switch使用前都进行空检查的条件。


问题答案:

正如damryfbfnetsi 在评论中指出的那样,JLS§14.11具有以下注释:

禁止将其null用作开关标签,以防止他人编写永远无法执行的代码。如果switch表达式是引用类型,即String装箱的原始类型或枚举类型,则如果表达式null在运行时求值为,则会发生运行时错误。
根据Java编程语言的设计人员的判断,这比静默跳过整个switch语句或选择在default标签(如果有的话)之后执行语句(如果有的话)更好。

(强调我的)

虽然最后一句跳过了使用的可能性case null:,但这似乎是合理的,并提供了语言设计者意图的观点。

如果我们宁愿看一下实现细节,Christian
Hujer的这篇博客文章就为什么null不允许在开关中进行了一些有见地的推测(尽管它集中在enum开关而不是String开关上):

switch后台,该语句通常将编译为一个tableswitch字节码。s
的“物理”论证switch及其案例int。通过调用方法确定要打开的int值Enum.ordinal()。序号从零开始。

这意味着映射null0不是一个好主意。第一个枚举值的开关与null不可区分。从1开始计数枚举的序数也许是个好主意。但是,还没有像这样定义它,因此不能更改此定义。

String开关的实现方式不同时,enum开关首先出现,并为引用类型为引用类型时的行为设定了先例null



 类似资料:
  • 本文向大家介绍为什么Java不支持<<相关面试题,主要包含被问及为什么Java不支持<<时的应答技巧和注意事项,需要的朋友参考一下 Java添加了运算符“ >>>”来执行逻辑右移,但是由于 逻辑和算术左移运算是相同的 ,因此Java中没有“ <<<”运算符。 来自Java的Shifts …

  • 我注意到一件奇怪的事情,显然Firefox说它支持HTTPS上的Brotli,但不支持HTTP?Brotli与gzip类似,但效率更高,为什么它会将其限制为HTTPS?在HTTPS选项卡上,我看到: 他被派去了。但在另一个网站上,我没有看到。为什么它不能做Brotli压缩HTTP?

  • 为什么Java中的泛型可以处理类而不能处理基元类型? 例如,这个操作很好: 但这是不允许的:

  • 现支持语言:中文简体,中文繁体,英文。 在安装服务器端程序时,会有选项,可以根据自己的需要,选择语言。

  • 问题内容: 我决定使用Swift的case语句和元组。它看起来像是该语言的较酷功能之一。 我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值作为案例。这是一个示例(可以粘贴到Playground中并运行) 注释掉的代码不会编译(如果重要的话,在Xcode 6.3中)。在下面的情况下(我分别列出了joesBirthday元组的所有元素)更难键入且更难阅读,确实可以工作)

  • 问题内容: Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么? 问题答案: 在两行之间阅读时,我认为逻辑是这样的: 通常,J