使用枚举时切换时出现奇怪的编译错误

时间:2012-04-28 07:39:58

标签: java compiler-errors switch-statement

我刚注意到一个奇怪的案例,想看看是否有人能够解释它。这是我的情况:

private enum Classifiers {
    NEURAL_NETWORK, NEAREST_NEIGHBOURS, IDENTITY;
}
private ClassifierInterface getClassifierInstance(Classifiers classifier) {
    switch (classifier) {
    case NEURAL_NETWORK:
        return new DoubleLayeredNeuralNetwork();
    case NEAREST_NEIGHBOURS:
        return new NearestNeighbours();
    case IDENTITY:
        return new IdentityClassifier();
    }
    return null; // If I comment out this line I get compilation error
}

查看评论。我希望此行会报告Unreachable code错误。相反,如果我注释掉这一行,我会收到Method must return value错误。但是,程序流无法通过那里。

我甚至认为,对于传递null值的情况,它将是一个保护案例,但正如预期的那样,这会触发NullPointerException切换条件。

我不经常使用switch,可能我在这里遗漏了一些东西。有人可以尝试帮助理解这种行为吗?

2 个答案:

答案 0 :(得分:4)

这是正确的行为,因为您没有默认的case语句。问题是您可以稍后向enum添加值,而不是重新编译使用它的代码。通过强制您在不是其中一个值时始终处理,这将被覆盖。

BTW:classifier可能为null,这是另一个选项开关无法处理的问题。

答案 1 :(得分:3)

这个问题很有意思......

我们有这样的东西,编译器很高兴!

public enum Coin {
     PENNY,
     NICKEL,
     DIME,
     QUARTER;
}

private enum CoinColor { COPPER, NICKEL, SILVER }
private static CoinColor color(Coin c) {
    switch(c) {
        case PENNY:
            return CoinColor.COPPER;
        case NICKEL:
            return CoinColor.NICKEL;
        case DIME: case QUARTER:
            return CoinColor.SILVER;
        default:
            throw new AssertionError("Unknown coin: " + c);
    }
}

Java Languaje规范说:

  

鼓励(但不要求)Java编译器提供警告   如果对枚举值表达式的开关缺少默认标签和   缺少一个或多个枚举类型常量的大小写标签。 (这样   如果表达式求值,语句将默默地不执行任何操作   其中一个缺失的常数。)