【Java】例外が発生しないメソッド = 万能とは限らない

Javaでオブジェクトを文字列に変換する方法ってたくさんありますよね。toString()とかString.valueOf()とか。中でもObjects.toString()は例外も発生しないし、nullだった場合の値を自分で決められるし最強じゃんと思っていたのですが、何でもかんでもObjects.toString()を使えばいいと言うわけではないことに気がつきました。

オブジェクト → 文字列変換メソッドの違いについておさらい

それぞれのメソッドの主な違いはnullだった場合の動作です。

  • 例外が発生するtoString()
Object obj = null;
obj.toString();  // NullPointerExceptionが発生
  • 例外が発生しないString.valueOf
Object obj = null;
String.valueOf(obj);  // "null"と言う文字列が返る
  • 例外が発生しないかつnullの時の値を自分で決められるObjects.toString()
Object obj = null;
Objects.toString(obj); // "null"と言う文字列が返る
Objects.toString(obj, "存在しません");  // 第二引数に指定した"存在しません"が返る

Objects.toString()使っとけばOKなの?

一見便利そうなObjects.toString()。実際Javaを使い慣れていない私は、とりあえず文字列に変換するときはObjects.toString()を使っておけば安心なんだなと感じました。

ですが! だからと言って何でもかんでもObjects.toString()を使えばいいと言うわけではありません。

そもそもnullを許容できない場合がある

DB保存するときにその値にNOT NULL制約が指定されている場合とか、APIにリクエスト送信するのに必須値になっている場合はnullを許容できないですよね。そう言う場合って、外部からリクエストを受ける際に何らかの方法でnullチェックを行うと思います。 Spring Bootだったら@NotNullアノテーションを付けたり。 その状態でいざ文字列に変換しようと言う時にnullが入っている場合、考えられる状況は変換する前の処理で実装ミスがあるか予期せぬ不具合ぐらいしかないと思います。この場合ぬるぽが発生してくれた方がありがたくないでしょうか?

nullを許容できない場合はtoString()で問題ない

nullを許容できない場合はそもそもそこでnullになっていること自体がおかしいので、Objects.toString()を使う必要はありません。むしろ、nullをスルーしてしまう上に、変な値を入れてしまうことになるので使わない方がいいです。ぬるぽが発生すれば実装ミスにいち早く気づけますし、catchしてログを出力することもできます。 なので、こう言う場合はぬるぽを恐れずにどんどんtoString()を使っていきましょう。

まとめ

今までぬるぽを発生させるような実装をしてはいけない、と言う言葉を鵜呑みにして、とりあえずぬるぽが発生しないメソッドを選びがちでしたが、本質に気付くことができたような気がします。何事も馬鹿の一つ覚えにならないように気をつけていきたいですね。