ログにStringの変数を+
演算子で文字列結合して表示させたい時があるんですが、「あれ?この変数nullでも大丈夫なんだっけ?」と思うことが多いのでメモしておきます。ログ出力のためにヌルポでクラッシュさせたら本末転倒ですからね。
結論としては問題なし!!です。
+演算子でnullを結合してもだいじょーぶ
String n = null;
System.out.println("fuga:" + n);
// fuga:nullと出力される
formatにnullを使ってもだいじょーぶ
String.formatを使っても大丈夫
String n = null;
System.out.println(String.format("hoge:%s",n));
// hoge:nullと表示される
System.out.println(String.format("fuga:%02d", n));
// fuga:nullと表示される
+演算子でクラスのインスタンスを結合してもだいじょーぶ
import java.util.ArrayList;
public class Main {
public static void main(String[] argv) {
// 独自クラスもだいじょーぶ
MyClass myClass = new MyClass();
System.out.println("hoge:" + myClass);
// hoge:MyClass@60e53b93 と表示(@以降は変わる)
// ビルトインクラスもだいじょーぶ
ArrayList<Object> arrayList = new ArrayList<>();
System.out.println("fuga:" + arrayList);
// fuga:[]と表示(なるほどなるほど)
// ビルトインクラスもダイジョーブ
Object object = new Object();
System.out.println("piyo:" + object);
// piyo:java.lang.Object@5e2de80c(@以降は変わる)
}
}
class MyClass {
}
formatでクラスのインスタンスを使うのはちょっと注意して!
ここまで見てきましたが、fomat演算子の%s
以外は、変換できないクラスのインスタンスだとExceptionスローして落ちます。
public class Main {
public static void main(String[] argv) {
MyClass myClass = new MyClass();
System.out.println(String.format("hoge:%s",myClass));
// hoge:MyClass@78308db1と表示(@以降は変わる)
System.out.println(String.format("hoge:%d",myClass));
// java.util.IllegalFormatConversionException で落ちる
}
}
class MyClass {
}
まとめ
Java8の動作ベースでの検証でしたが、+演算子で結合している場合は大丈夫でしたね。
Java先生方からベスプラがコメントされたりしないかなぁ。