Java 为什么多次调用System.out.println会在一行中打印值

Java 为什么多次调用System.out.println会在一行中打印值,java,stack-overflow,println,Java,Stack Overflow,Println,这只是一个有趣的问题。不是真正的生产代码。 我不想修理它。我只是想了解这种奇怪的行为。 我有代码,应该在每行打印“1”。事实上,这是错误的。我在一行中得到了像“11111111”这样的奇怪结果 class Scratch { public static void main( String[] args ) { method(); } static void method() { try { System.out.println(1);

这只是一个有趣的问题。不是真正的生产代码。 我不想修理它。我只是想了解这种奇怪的行为。 我有代码,应该在每行打印“1”。事实上,这是错误的。我在一行中得到了像“11111111”这样的奇怪结果

class Scratch
{
  public static void main( String[] args )
  {
    method();
  }

  static void method()
  {
    try
    {
      System.out.println(1);
      method();
    }
    catch ( StackOverflowError e )
    {
      method();
    }
  }
}
输出可以是以下内容:

1
11111
1
11111
1
1
1
1
1
11111111
1
11111
公共类测试{
静态整数计数=0;//计数器
公共静态void main(字符串[]args)
{
方法();
}
静态孔隙法()
{
尝试
{
if(count<10)//运行10次后停止代码
{
系统输出打印项次(1);
计数+++;//递增计数
方法();
}
}
捕获(堆栈溢出错误e)
{
方法();
}
}
}
您的问题是,如果没有if或限制因子,您无法进行递归。在上面的代码中,我使用了一个计数来防止编码打印无穷大

记住,无论何时使用递归,它都必须有一个条件来告诉它何时停止


编辑:用于在多行上打印。这很可能是因为计算机打印速度非常快,以至于它在某些地方重叠

好奇地试图处理你的代码,今天感觉很大胆

如果添加
System.out.println(2)
catch
中,您可以看到结果现在显示1是以单行打印的,它是catch中的一行和触发错误的一行,忽略光标从
println

static void method() {
    try {
        System.out.println(1);
        method();
    } catch (StackOverflowError e) {
        System.out.println(2);
        method();
    }

}
输出:

1
1
122
122
1
122
122
1
1

然而,正如@khelwood在中所说,您不应该对忽略重复的
stackoverflowerr
s的程序有任何特定的期望。任何事情都可能出错

然而,尝试一个不太可能的解释:
System.out.println(1)
包括打印
1
和平台特定的新行序列-在Windows上同样包括打印
\r
\n
。在成功打印
1
之后,当尝试打印换行符时,没有任何东西可以阻止堆栈溢出在两者之间发生。在这些情况下,下一个
1
(如果成功)将打印在同一行上


您的输出似乎显示了大约30个
1
和大约12个(完整)换行符。显然,我所描绘的情景发生的次数有一半多一点。如果这是正确的解释,我们不知道。

您正在递归调用您的方法,当它在溢出上出错时,您仍然递归调用它。为什么你不循环得到结果,因为你的代码被破坏了。溢出后继续打印。无限递归+忽略异常==古怪请阅读问题。我不需要修理。我知道那个方法是错误的。我只是想了解这种奇怪的行为。可能取决于平台和实现
PrintStream
System.out
)使用内部缓冲区并将其打印到控制台。似乎写入缓冲区的速度比刷新缓冲区的速度要快,因此在一行中会累积
1111
。(我无法证实这一点)有趣的事实:程序运行的时间越长,一行打印的
1
s就越多,似乎java真的无法恢复那么快
1
1
122
122
1
122
122
1
1