switch文とInteger型

2018年4月4日構文

スポンサーリンク

こんにちは。「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) { … }という書き方ができます。

以下にフローを書きます。ただし、今回は実行時にエラーが発生するように書きました。(気をつけなけらばならないと思いましたのでエラーになる場合を挙げました。)

  1. Integer型配列numsを以下の値で初期化する。
    要素番号
    0 10
    1 11
    2 12
    3 null
  2. 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の場合です。他にもあると思います。

スポンサーリンク

おすすめQAサイト

エンジニア特化型Q&Aサイト【teratail(テラテイル)】:
このサイトはプログラミング特化型のQAサイトです。ソースを見やすく整形させた状態で表示させることが出来ます。