【问题标题】:Why stringbuilder stops adding elements after using the null character?为什么 stringbuilder 在使用空字符后停止添加元素?
【发布时间】:2013-07-03 13:52:36
【问题描述】:

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

例如:

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

返回

. 

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

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

【问题讨论】:

  • '\0' - null 终止符,在 C 和 C++ 字符串中用作字符串的结尾
  • 我怀疑StringBuilder 已停止添加新元素。这更可能是显示结果 String 时出现的问题。附加几个元素后StringBuilderlength() 是什么?
  • 我在 Win 7 的 jdk 1.6.0_25 上的 eclipse 中运行了您的确切代码,它打印出 . a.... 可能是特定于 shell 的东西。
  • 我认为这是特定于操作系统的,因为 Java 字符串可以包含空字符。 Win7在这里打印相同
  • 打印.a.这里ideone.com/BjRKT0

标签: java linux eclipse null character


【解决方案1】:

空字符是一个保留字符,表示字符串的结束,所以如果你打印一些后面跟\u0000的东西,后面就不会再打印了。


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

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

【讨论】:

  • 它在windows机器上打印一个.、一个框(用于空字符)、一个a和一个.
  • @BheshGurung 我认为这是因为 UNIX 系统的工作方式与 Windows 不同,理论上如果你在 OSX 上尝试同样的事情,它应该打印 .
  • Java 中不使用空字符来终止字符串。
  • null 是保留字符在哪里? gnome-terminal、xterm 和 rxvt 都没有问题中描述的行为。他们都只是忽略了空字符。
  • @Rotsor \u0000 被用作在类 C 语言中结束字符串的标准方式,终端也将其用作“字符串结尾”。您应该注意,这个问题已经有将近 4 年的历史了。 Linux 在不断发展,所以在这四年里事情可能发生了变化。在发布问题时,问题是真实的,但可能同时已经解决了。而且也许某些终端在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】:

    我尝试了您的测试,在我的 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'。

    我认为不打印比不附加的可能性更大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      相关资源
      最近更新 更多