首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么字符串switch语句不支持null case?

为什么字符串switch语句不支持null case?
EN

Stack Overflow用户
提问于 2013-08-16 07:20:05
回答 6查看 63.1K关注 0票数 135

我只是想知道为什么Java7的switch语句不支持null case而抛出NullPointerException?参见下面的注释行(示例取自the Java Tutorials article on switch):

代码语言:javascript
复制
{
    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;
}

这将避免在每次使用switch之前进行null检查的if条件。

EN

回答 6

Stack Overflow用户

发布于 2013-08-16 10:07:17

一般来说,null很难处理;也许没有null也能有更好的语言。

您的问题可能会通过以下方式解决

代码语言:javascript
复制
    switch(month==null?"":month)
    {
        ...
        //case "":
        default: 
            monthNumber = 0;

    }
票数 36
EN

Stack Overflow用户

发布于 2015-04-26 10:45:00

它并不美观,但是String.valueOf()允许您在开关中使用空字符串。如果找到null,它会将其转换为"null",否则只返回您传递给它的相同字符串。如果您不显式处理"null",那么它将转到default。唯一需要注意的是,无法区分字符串"null"和实际的null变量。

代码语言:javascript
复制
    String month = null;
    switch (String.valueOf(month)) {
        case "january":
            monthNumber = 1;
            break;
        case "february":
            monthNumber = 2;
            break;
        case "march":
            monthNumber = 3;
            break;
        case "null":
            monthNumber = -1;
            break;
        default: 
            monthNumber = 0;
            break;
    }
    return monthNumber;
票数 28
EN

Stack Overflow用户

发布于 2013-08-16 08:22:57

这是一次尝试回答为什么它抛出NullPointerException

下面的javap命令的输出显示,case是根据switch参数字符串的哈希码选择的,因此在对空字符串调用.hashCode()时抛出NPE。

代码语言:javascript
复制
6: invokevirtual #18                 // Method java/lang/String.hashCode:()I
9: lookupswitch  { // 3
    -1826660246: 44
     -263893086: 56
      103666243: 68
        default: 95
   }

这意味着,基于对Can Java's hashCode produce same value for different strings?的回答,尽管很少,但仍然存在匹配两种情况的可能性(两个具有相同散列代码的字符串)请参见下面的示例

代码语言:javascript
复制
    int monthNumber;
    String month = args[0];

    switch (month) {
    case "Ea":
        monthNumber = 1;
        break;
    case "FB":
        monthNumber = 2;
        break;
    // case null:
    default:
        monthNumber = 0;
        break;
    }
    System.out.println(monthNumber);

javap,用于

代码语言:javascript
复制
  10: lookupswitch  { // 1
              2236: 28
           default: 59
      }
  28: aload_3       
  29: ldc           #22                 // String Ea
  31: invokevirtual #24                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  34: ifne          49
  37: aload_3       
  38: ldc           #28                 // String FB
  40: invokevirtual #24                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  43: ifne          54
  46: goto          59 //Default

正如您所看到的,只为"Ea""FB"生成了一个案例,但是有两个if条件来检查每个案例字符串是否匹配。非常有趣和复杂的方式来实现这个功能!

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18263489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档