Java 使用开启枚举时出现奇怪的编译错误

Java 使用开启枚举时出现奇怪的编译错误,java,compiler-errors,switch-statement,Java,Compiler Errors,Switch Statement,我刚刚注意到一个奇怪的案例,想看看是否有人能解释它。我的情况如下: private enum Classifiers { NEURAL_NETWORK, NEAREST_NEIGHBOURS, IDENTITY; } private ClassifierInterface getClassifierInstance(Classifiers classifier) { switch (classifier) { case NEURAL_NETWORK: re

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

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
}
见评论。我希望这一行会报告
无法访问的代码
错误。相反,如果我注释掉这一行,我get
方法必须返回值
error。但是,程序流不可能通过那里

我甚至认为对于传入的
null
值,这将是一种保护情况,但正如预期的那样,这将触发切换条件的
NullPointerException


我不经常使用
开关
,可能我遗漏了一些东西。有人能帮你理解这种行为吗?

这是正确的行为,因为你没有默认的案例陈述。问题是,您可以稍后向
枚举添加一个值,而不必重新编译使用它的代码。通过强制您始终处理它不是其中一个值的情况,可以涵盖这一点


顺便说一句:
分类器
可能为空,这是另一个选项开关不幸无法处理的问题。

这个问题很有趣

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

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编译器(但不是必需的)提供警告 如果枚举值表达式上的开关缺少默认标签和 缺少一个或多个枚举类型常量的大小写标签。(如 如果表达式的计算结果为,则语句将不执行任何操作 缺少的常量之一。)


我也一直在想,为什么编译器不够聪明,不能看到它总是返回一些东西,
returnnull
是多余的。谢谢你的回答。然而,顺便说一句,你的情况并非如此,我已经在我的问题中提到过:null值触发开关中的NPE;我希望切换到支持
案例空:
或将
视为
默认值:
啊,对不起,我误解了你。谢谢你的回答。特别是报价。然而,这里提到了一个警告,而我得到了一个编译错误。有趣。你的例子也很好。