【问题标题】:Bizzare System.out.println() in Java ProgramJava程序中的Bizzare System.out.println()
【发布时间】:2011-03-25 08:33:51
【问题描述】:
String messageFile = ... // Assume messageFile SHOULD have the string "MESSAGE"
System.out.println("The messageFile is: " + messageFile + "!!");

通常,人们会期望上面的命令输出:

The messageFile is: MESSAGE!!!!

但是,我收到的是这个:

!!e messageFile is: MESSAGE

看看上面的语句,“!!”点似乎围绕着信息。我的理论是:

String messageFile = ... 

包含比我假设的“MESSAGE”更多的字符。结果,它将下一个输入(在本例中为“!!”)包装到 System.out.println() 消息的前面。

这是什么角色造成的?

额外信息:

顺便说一句,messageFile 正在通过将命令行参数传递给 java 类 myClassA 来初始化。 myClassA 的构造函数使用 super() 将 messageFile 参数传递给 myClassB。 myClassB 将 messageFile 传递给 function()。

【问题讨论】:

  • 是否可能有多个线程同时写入 System.out?我感觉 System.out 中使用的 PrintStreams 不是线程安全的。
  • @matt 对 print 或 println 的单独调用作为一个线程安全操作发生,但如果 System.out 和 System.err 都指向同一个地方(例如控制台),它们将竞争而你可能会得到看起来很傻的“混合”输出。

标签: java linux string debugging char


【解决方案1】:

用换行符替换文件中的所有回车,然后用单换行符替换所有双换行符:

messageFile.replace('\r', '\n').replace("\n\n", "\n)

应该禁止回车:D

【讨论】:

    【解决方案2】:

    我猜你在 messageFile 变量中有一个杂散的回车符 (\r),没有换行符 (\n)。

    EDIT - 按预期进行测试:

    class Println {
            public static void main(String[] args) {
                    System.out.println("xxxx this \rTEST");
            }
    }
    

    输出:

    TEST this 
    

    【讨论】:

    • 这可以说是在消息中读取的省略功能的问题。它可能没有正确处理 IO 格式。
    • 也许代码中的某个地方没有使用标准系统属性line.separator:依赖于平台的行分隔符(例如,UNIX 上的“\n”,Windows 上的“\r\n”) " 也许该应用程序是在 *NIX 上开发的,但现在在某些 Windows 上使用,使用硬编码 \n 而不是使用 line.separator 属性。所以还有一些 \r 剩余...
    【解决方案3】:

    为了调试,您应该通过codePointAt 打印messageFile 的每个字符的代码点。 结果,您可以准确地看到messageFile 的内容。

    【讨论】:

      【解决方案4】:

      您的消息变量可能在末尾包含一个“\r”(回车)或“\n”(换行)字符。这可能会导致光标在打印感叹号之前返回到第一列。

      【讨论】:

      • -1 表示错误。它必须是回车符(返回到行首)并且不能是换行符(将下降到下一行)。这些是打字机时代的倒退,当时这是两个独立的动作。回车是指您将纸卷推回右侧,这样您就可以再次从第一列开始。换行是当您推入将纸张通过一条线的小杠杆时。在我使用过的每台打字机上,这些都被设计为同时发生。
      • 我完全清楚这一点。但是,如果不了解发布者使用的终端,它总是有可能是断行的换行符。检查两者都没有错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 2014-10-16
      相关资源
      最近更新 更多