JavaのStringBuilder.appendメソッドにnullを渡すと “null” という文字列が追加されます。
検証と、nullならappendしない実装例を示します。
検証
StringBuilder.appendメソッドにnullを渡すとどうなるか、実際に試した結果が以下の通りです。
App.java
public class App {
public static void main(String[] args) {
String str = null;
StringBuilder sb = new StringBuilder()
.append("[開始]")
.append(str)
.append("[終了]");
System.out.println(sb.toString());
}
}
実行結果
[開始]null[終了]
“null” という文字列が追加されています。
なぜこのような仕様にしたのかはわかりませんが、 公式のリファレンス にも「strがnullの場合は、”null”という4文字が追加されます」と記載があります。
なお、StringBufferも同じです。
App.java
public class App {
public static void main(String[] args) {
String str = null;
StringBuffer sb = new StringBuffer()
.append("[開始]")
.append(str)
.append("[終了]");
System.out.println(sb.toString());
}
}
実行結果
[開始]null[終了]
nullならappendしない実装例
StringBuilderインスタンスと、それに追加したい文字列を受け取り、nullならappendしないstaticメソッドを作ったので以下に掲載します。
また、StringBuilder.appendメソッドは可変長引数に対応していませんが、対応できるようにしたほうが何かと便利だと思い、そうしています。
App.java
public class App {
public static void main(String[] args) {
String str = null;
StringBuilder sb = new StringBuilder();
append(sb, "[開始]", str, "[終了]");
System.out.println(sb.toString());
}
public static StringBuilder append(StringBuilder sb, String... strs) {
if (sb == null) throw new NullPointerException("Argument 'sb' is null.");
if (strs == null) throw new NullPointerException("Argument 'strs' is null.");
for (String str : strs) {
if (str == null) continue;
sb.append(str);
}
return sb;
}
}
実行結果
[開始][終了]
補足:TextStringBuilder
もしApache Commonsを使用してよいなら、そもそもStringBuilderではなくorg.apache.commons.text.TextStringBuilderを使ったほうが良いかもしれません。
TextStringBuilder.appendメソッドはデフォルトでnullを渡しても何も追加されません。また、appendAllメソッドなら可変長引数にも対応しています。
App.java
import org.apache.commons.text.TextStringBuilder;
public class App {
public static void main(String[] args) {
String str = null;
TextStringBuilder tsb = new TextStringBuilder()
.appendAll("[開始]", str, "[終了]");
System.out.println(tsb.toString());
}
}
実行結果
[開始][終了]