【问题标题】:Java 7 - null as case expression [duplicate]Java 7 - null 作为 case 表达式
【发布时间】:2015-05-18 22:27:48
【问题描述】:

为什么编译失败,出现“case 表达式必须是常量表达式”的错误? null 不是常量(在编译时已知)吗? 像case ((String)null) 一样将null 值显式转换为String 也无济于事(我得到了同样的错误)。

public static String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
    String typeOfDay;
    switch (dayOfWeekArg) {

        case null:
            typeOfDay = "NULL";
            break;

        case "Monday":
            typeOfDay = "Start of work week";
            break;
        case "Tuesday":
        case "Wednesday":
        case "Thursday":
            typeOfDay = "Midweek";
            break;
        case "Friday":
            typeOfDay = "End of work week";
            break;
        case "Saturday":
        case "Sunday":
            typeOfDay = "Weekend";
            break;
        default:
            throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
    }
    return typeOfDay;
}

【问题讨论】:

标签: java


【解决方案1】:

是的,case 表达式必须是常量表达式,但是 nullJLS, Section 14.11 明确禁止,它描述了 switch 语句:

给定一个 switch 语句,以下所有条件都必须为真,否则会发生编译时错误:

  • 与 switch 语句关联的每个 case 常量必须与 switch 语句的表达式类型(第 5.2 节)的赋值兼容。

  • 如果 switch 语句的 Expression 类型是枚举类型,那么与 switch 语句关联的每个 case 常量都必须是该类型的枚举常量。

  • 与 switch 语句关联的任何两个 case 常量都没有相同的值。

  • 与 switch 语句关联的大小写常量都不是 null

  • switch 语句最多关联一个默认标签。

(斜体强调我的)

作为一种解决方法,您可以在 switch 语句之外测试 null

【讨论】:

  • 我明白了,它在 JLS 中。谢谢。
【解决方案2】:

如果你传递一个空值,switch 语句将抛出一个NullPointerException。使用separate test to check for null values.

【讨论】:

  • 它确实会抛出 NPE,但我必须先编译它(例如,通过删除那个 case null 语句)。所以我也觉得这很相关。谢谢。
猜你喜欢
  • 2020-02-20
  • 1970-01-01
  • 2020-07-03
  • 2010-12-15
  • 2011-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
相关资源
最近更新 更多