こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

switch文とInteger型

こんにちは。「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の場合です。他にもあると思います。