[Javaコードの改善]switchによる空の値異常に注意
7030 ワード
列挙を使用して定数を定義すると、疑似クラスの列挙項目ごとにその動作を説明するためのswitch文の判断が大量に伴います.たとえば、次のようにします.
上のコードはSeasonタイプの列挙を入力し、季節ごとのアクティビティを出力するためにswitchを使用してマッチングします.しかし、コードに問題はありませんか?
doSports(null)は、switchで指定する値に一致しないためdefaultのコードブロックが印刷する「出力エラー」が印刷されるようです.
実行結果:
switchの行には空のポインタが報告されています...これが列挙とswitchの特性に関係しています...この問題も開発中によく発生します.
現在、Javaのswitch文はbyte、short、char、intタイプ(JDK 7ではStringタイプの使用が許可されている)しか判断できません.これはJavaコンパイラの制限です.問題は、列挙タイプもswitchの後に続く理由です.
コンパイル時に、コンパイラはswitch文の後のパラメータが列挙タイプであると判断し、列挙のソート値に基づいて一致し続けます.つまり、上のコードは以下のコードと同じです.
しかし、これは間違っています...各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に対応する
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に対応する