12

当我使用空字符'\u0000'时,stringbuilder 将停止添加新元素。

例如:

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

返回

. 

我知道不应打印空值(或像空字符串值一样打印),但在这种情况下,为什么 stringbuilder 无法添加更多元素?

注意:我在 ubuntu 上使用 jdk 1.6.0_38。

4

3 回答 3

7

空字符是一个保留字符,表示字符串的结尾,所以如果你打印一些后面跟着 的东西,那么它之后的\u0000任何东西都不会被打印出来。


为什么 stringbuilder 在使用空字符后停止添加元素?它不是真正的 java,而是您的终端将其\u0000视为字符串的结尾。

正如有人所说,使用 Windows 可以输出.a.(我没有测试过),这是因为 Windows 终端的工作方式与基于 Unix 的系统终端不同。我很确定如果您在 OSX 机器上运行此代码,您将获得与在 linux 上获得的相同的输出

于 2013-07-03T13:57:09.430 回答
7

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终止字符后停止打印。不同的控制台可能会以不同的方式处理。

于 2013-07-03T13:59:23.953 回答
1

我试过你的测试,它在我的 Windows 7 系统上的 Eclipse 中没有失败。但是,运行此测试程序将区分非附加和非打印。我建议在失败的环境中运行它。

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”。

我认为非打印比非附加更有可能。

于 2013-07-03T14:01:02.603 回答