2012-04-28 15 views
2

私はちょうど1つの好奇心が強いケースに気づいて、誰かがそれを説明できるかどうかを見たいと思っていました。ここに私の場合です:列挙型のスイッチを使用しているときの奇妙なコンパイルエラー

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に値を追加し、それを使用するコードを再コンパイルしないことです。あなたが値の1つではないときに常に処理するようにすることで、これがカバーされます。

BTW:classifierは、残念なことに別のオプションスイッチであるnullでもかまいません。

+0

答えをありがとう。しかし、あなたのBTWはあまりそうではありません、私はすでに私の質問でそれを言及:ヌル値はスイッチのNPEをトリガーします。 –

+0

私のポイントは;私は 'case null:'をサポートするか、 'default:' null 'を扱うように切り替えるのが好きだったでしょう –

+0

ああ、私はあなたを誤解してしまいました。 –

3

質問は興味深いです...

私たちは、このような何かを持っていると、コンパイラは幸せです!

のJava Languaje仕様は言う:

A Javaコンパイラを奨励(必須ではありません)列挙値式のスイッチがデフォルトのラベルがない場合、警告 を提供し、 が欠けています1つ以上の列挙型の定数の大文字と小文字のラベル。 (このような 式は に不足している定数のいずれかを評価された場合、文は黙って何もしません。)

+0

ありがとうございました。特に引用のため。しかし、そこには警告が記載されていますが、コンパイルエラーが発生します。面白い。あなたの例も良いです。 –

関連する問題