プログラミング

[Java] StringBuilderにnullをappendすると文字列の “null” が追加される

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());
  }
}

実行結果

[開始][終了]

タイトルとURLをコピーしました