【Java】数値がNULLのときに文字列へ変換するときに注意すること

今回は、数値型(Intgerクラス、Longクラスなど)の値が「NULL」になる可能性があるとき、文字列型(String)に変換する処理を使用するときの注意内容を紹介していきます。

スポンサーリンク

検証環境

検証に使用した環境/ライブラリを次に記載します。

  • Java
    • バージョン:11

変換メソッド

数値を文字列に変換する方法は、次のメソッドなどが用意されています。

  • String.valueOf
  • Intger.toString
  • Objects.toString

それぞれのメソッドで「NULL」を指定したときの動作と参考情報を記載していきます。

String.valueOf

「String.valueOf」メソッドで「NULL」を指定した場合は、「"null"」という文字列が返却されます。これは、処理内容が「NULL」のときに「"null"」という文字列を返却する処理になっているためです。

【「String.valueOf」のメソッドの処理内容】

処理内容は、次のようになっています。

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

「obj == null」の場合は、「"null"」を返却する処理になっています。

【「String.valueOf」の返却内容を確認するプログラム例】

プログラム例は、次のようになります。

Integer i = null;
System.out.println(String.valueOf(i) == null); // false
System.out.println("null".equals(String.valueOf(i))); // true

「String.valueOf(i) == null」が「false」になるのは、「NULL」とは違う情報を返却していることを確認できます。

「"null".equals(String.valueOf(i))」が「true」になるのは、「"null"」という文字列を返却していることを確認できます。

Intger.toString

「Intger.toString」メソッドで「NULL」を指定した場合は、「NullPointerException」の例外が発生します。これは、引数に指定した値をプリミティブ型へ自動的に変換処理が行われるために発生します。

Integerクラスなどからプリミティブ型への変換は、「アンボクシング(Unboxing)」という機能により自動的に変換処理が行われます。変換対象が「NULL」の場合は「NullPointerException」が発生する動作になります。

【アンボクシングの動作を確認するプログラム例】

プログラム例は、次のようになります。

Integer i = null;
int num = i; // このタイミングで「NullPointerException」が発生します。

「int num = i」でアンボクシングにより自動的に変換処理が行われるため「NullPointerException」が発生することを確認できます。

アンボクシングの動作については、次のサイトの情報を確認してみてください。

Autoboxing

Objects.toString

「Objects」クラスの「toString」は、複数のメソッドが用意されているためそれぞれ紹介していきます。

toString(Object o)

引数を1つ指定できる「toString」メソッドで「NULL」を指定した場合は、「String.valueOf」と同じ動作になります。

【「Objects.toString」の引数1つのメソッド内容の処理内容】

処理内容は、次のようになっています。

public static String toString(Object o) {
    return String.valueOf(o);
}

toString(Object o, String nullDefault)

引数を2つ指定できる「toString」メソッドは、変換対象の値と「NULL」と判定したときに返却してほしい値を指定することができます。

【「Objects.toString」の引数2つのメソッド内容の処理内容】

処理内容は、次のようになっています。

public static String toString(Object o, String nullDefault) {
    return (o != null) ? o.toString() : nullDefault;
}

「o != null」で「NULL」と判定した場合は、指定した「nullDefault」の値を返却する処理になっています。

まとめ

紹介したメソッドをまとめると次のようになります。

クラス/メソッド名「NULL」指定時の動作
String.valueOf「”null”」という文字列が返却される。
Intger.toString変換処理(アンボクシング)にて「NullPointerException」が発生する。
Objects.toString(Object o)「String.valueOf」と同じ動作になる。
Objects.toString(Object o, String nullDefault)「o == null」の場合は、「nullDefault」の値が返却される。
数値から文字列へ変換するときに「NULL」を指定したときの動作一覧

それぞれ使用するメソッドにより、「NULL」となる可能性がある数値を文字列に変換するときの処理が結果が違うため注意が必要です。