我刚注意到一个奇怪的案例,想看看是否有人能够解释它。这是我的情况:
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
,可能我在这里遗漏了一些东西。有人可以尝试帮助理解这种行为吗?
答案 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编译器提供警告 如果对枚举值表达式的开关缺少默认标签和 缺少一个或多个枚举类型常量的大小写标签。 (这样 如果表达式求值,语句将默默地不执行任何操作 其中一个缺失的常数。)