2

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

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经常使用,可能我在这里遗漏了一些东西。有人可以尝试帮助理解这种行为吗?

4

2 回答 2

4

这是正确的行为,因为您没有默认 case 语句。问题是您可以为后者添加一个值,enum而不是重新编译使用它的代码。当它不是值之一时,强制您始终处理,这被涵盖了。

顺便说一句:classifier可能是 null 这是另一个选项开关不幸无法处理。

于 2012-04-28T07:47:09.460 回答
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 语言规范说:

如果枚举值表达式上的开关缺少默认标签并且缺少一个或多个枚举类型常量的大小写标签,则鼓励(但不是必需)Java 编译器提供警告。(如果表达式的计算结果为丢失的常量之一,那么这样的语句将默默地不做任何事情。)

于 2012-04-28T07:50:20.367 回答