[Javaコードの改善]switchによる空の値異常に注意

7030 ワード

列挙を使用して定数を定義すると、疑似クラスの列挙項目ごとにその動作を説明するためのswitch文の判断が大量に伴います.たとえば、次のようにします.
 1 public class Client {
 2     public static void main(String[] args) {
 3 
 4         doSports(null);
 5     }
 6 
 7     public static void doSports(Season season) {
 8         switch (season) {
 9         case Spring:
10             System.out.println("     ");
11             break;
12         case Summer:
13             System.out.println("    ");
14             break;
15         case Autumn:
16             System.out.println("     ");
17              break;
18         case Winter:
19             System.out.println("    ");
20             break;
21         default:
22             System.out.println("    !");
23             break;
24         }
25     }
26 }
27 
28 enum Season {
29     Spring, Summer, Autumn, Winter;
30 }

上のコードはSeasonタイプの列挙を入力し、季節ごとのアクティビティを出力するためにswitchを使用してマッチングします.しかし、コードに問題はありませんか?
doSports(null)は、switchで指定する値に一致しないためdefaultのコードブロックが印刷する「出力エラー」が印刷されるようです.
実行結果:
Exception in thread "main" java.lang.NullPointerException
    at cn.summerchill.test.Client.doSports(Client.java:12)
    at cn.summerchill.test.Client.main(Client.java:8)

switchの行には空のポインタが報告されています...これが列挙とswitchの特性に関係しています...この問題も開発中によく発生します.
現在、Javaのswitch文はbyte、short、char、intタイプ(JDK 7ではStringタイプの使用が許可されている)しか判断できません.これはJavaコンパイラの制限です.問題は、列挙タイプもswitchの後に続く理由です.
コンパイル時に、コンパイラはswitch文の後のパラメータが列挙タイプであると判断し、列挙のソート値に基づいて一致し続けます.つまり、上のコードは以下のコードと同じです.
public class Client {
    public static void main(String[] args) {

        doSports(Season.Spring);
    }

    public static void doSports(Season season) {
        switch (season.ordinal()) {
        case Season.Spring.ordinal():
            System.out.println("     ");
            break;
        case Season.Summer.ordinal():
            System.out.println("    ");
            break;
        case Season.Autumn.ordinal():
            System.out.println("     ");
             break;
        case Season.Winter.ordinal():
            System.out.println("    ");
            break;
        default:
            System.out.println("    !");
            break;
        }
    }
}

enum Season {
    Spring, Summer, Autumn, Winter;
}

しかし、これは間違っています...各case文に報告されます. case expressions must be constant expressions..しかし本の中でこの点に言及していません.....なぜか分かりません.....
switch文は、season変数の並べ替え値を先に計算する、列挙定数の各並べ替え値と比較する.
我々の例ではseasonの変数値はnullであり、ordinal()メソッドを実行できないため、空のポインタが異常になった.
解決策としては、doSports()メソッドで入力パラメータがnullであるか否かを判定すればよいという簡単な方法もある.
ordinal単語は序数の意味です. ordinal()メソッドは0から始まる数字.....Springが0,Summerが1,Autumnが2,Winterが3に対応する