Подтвердить что ты не робот

Почему stringbuilder останавливает добавление элементов после использования нулевого символа?

Когда я использую нулевой символ '\u0000', stringbuilder остановит добавление новых элементов.

Например:

StringBuilder _stringBuilder = new StringBuilder();
_stringBuilder.append('\u0000');
_stringBuilder.append('a');
System.out.println("."+_stringBuilder+".");

возвращает

. 

Я понимаю, что нулевое значение не должно быть напечатано (или напечатано, как если бы это было значение String), но в этом случае почему stringbuilder не может добавить больше элементов?

Примечание. Я использую jdk 1.6.0_38 на ubuntu.

4b9b3361

Ответ 1

Нулевой символ - это зарезервированный символ, который указывает конец строки, поэтому, если вы печатаете что-то, за которым следует \u0000, больше ничего не будет напечатано.


Почему stringbuilder останавливает добавление элементов после использования нулевого символа? Это не действительно java, это ваш терминал, который обрабатывает \u0000 как конец строки.

Как говорит кто-то, с Windows вывод может быть .a. (я его не тестировал), это потому, что терминал Windows работает иначе, чем терминал на базе Unix. Я уверен, что если вы запустите этот код на машине OSX, вы получите тот же результат, что и тот, который вы получите на linux

Ответ 2

Ваш stringBuilder все еще добавляет элементы, см.

StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append('\u0000');
System.out.println(stringBuilder.length()); // prints 1
stringBuilder.append('a');
System.out.println(stringBuilder.length()); // prints 2

Я предполагаю, что ваша консоль перестанет печатать после символа завершения \u0000. Другая консоль может обрабатывать это по-другому.

Ответ 3

Я пробовал ваш тест, и он не прерывается в Eclipse в моей системе Windows 7. Тем не менее, запуск этой тестовой программы будет отличаться от не-добавления и непечатания. Я предлагаю запустить его в непринужденной среде.

public class Test {
  public static void main(String[] args){
    StringBuilder _stringBuilder = new StringBuilder();
    _stringBuilder.append('\u0000');
    _stringBuilder.append('a');
    System.out.println("."+_stringBuilder+".");
    System.out.println(_stringBuilder.length());
    System.out.println(_stringBuilder.charAt(1));
  } 
}

Если проблема не добавляется, длина будет меньше 2, и попытка распечатать символ в индексе 1 завершится неудачно. Если проблема не печатается, длина будет равна 2, а символ в индексе 1 будет "a".

Я думаю, что не-печать гораздо более вероятна, чем неприемлемая.