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;我希望切换到支持案例空:
或将空
视为默认值:
啊,对不起,我误解了你。谢谢你的回答。特别是报价。然而,这里提到了一个警告,而我得到了一个编译错误。有趣。你的例子也很好。