こんにちは。「Javaを復習する初心者」です。
今回はwhile文のキーにInteger型を使ってみました。前回はswitchのキーにint型を使いました。int型の他に使える整数値のプリミティブ型はchar、byte、short型があります。また、これらのプリミティブ型に対応するラッパークラスが使えます。
プリミティブ型とラッパークラス
プリミティブ型には、それぞれに対応するラッパークラスが以下のように用意されています。
プリミティブ型 | ラッパークラス |
---|---|
int | Integer |
short | Short |
byte | Byte |
char | Character |
int、short、byteは整数値を格納する変数で、この順で使える値の範囲が大きく、int型の範囲は-2147483648から2147483647です。int型より範囲が大きいlong型というのがありますが、switch文には使えません。char型は文字コードを格納する変数です。負の数は扱えません。ちなみにC言語にはunsinedというキーワードがありますがJavaにはありませんので、int型で正の整数だけ扱う場合でも宣言はintとするしかないです。
ソースと実行結果
今回のswitch文のサンプルはInteger型で動かそうと思います。例えば、n = new Integer(1);と書けば1という値を保持したオブジェクトnが生成されます。switch (n) { … }という書き方ができます。
以下にフローを書きます。ただし、今回は実行時にエラーが発生するように書きました。(気をつけなけらばならないと思いましたのでエラーになる場合を挙げました。)
- Integer型配列numsを以下の値で初期化する。
要素番号 値 0 10 1 11 2 12 3 null - numsの要素1番目から順に以下の処理をする。
条件 処理内容 11の場合 “case 11です。”をprintlnで出力する。 上記以外の場合 “デフォルトです。”をprintlnで出力する。
以下はソースと実行結果です。
package test;
public class HelloSwichInteger {
public static void main(String[] args) {
Integer[] nums = {
new Integer(10),
new Integer(11),
new Integer(12),
null };
for (Integer num : nums) {
switch (num) {
case 11:
System.out.println("case 11です。");
break;
default:
System.out.println("デフォルトです。");
break;
}
}
}
}
デフォルトです。
case 11です。
デフォルトです。
Exception in thread "main" java.lang.NullPointerException
at test.HelloSwichInteger.main(HelloSwichInteger.java:13)
解説
拡張for文を使って、switch文で分岐処理をしています。ループの4回目でエラーが出力されました。numsの要素4番目はnullという値が格納されてます。
Integer型はオブジェクトなのでnullにできます。(フィールドではオブジェクト型の初期値はnullです。ローカル変数では初期化しないとコンパイルエラーです。)参照するオブジェクトがないという状態です。switch文のキーでInteger型を使った場合、おそらく内部の処理ではキーに対してメソッドを呼び出してCaseラベルの値と比較しているのだと思います。そのため、NullPointerExceptionが発生するということなのでしょう。
どのようなときにIntegerにnullを格納するという使い方をするのでしょうか。例えば画面に年齢の入力欄を作ったとして、Integerで入力値を受け取るときなどでしょうか。年齢の未入力を許可しているならば、未入力で入力された場合を処理しなくてはなりません。未入力ならばInteger型変数の値にnullを格納すると思います。後思いつく場面はデータベースのカラムがnullの場合です。他にもあると思います。