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

Why multiple calls of System.out.println prints values in single line

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

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

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

输出可能如下:

1
11111
1
11111
1
1
1
1
1
11111111
1
11111
public class Test {

 static int count = 0; //counter

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

  static void method()
  {
    try
    {
        if (count < 10) //Stop code after 10 runs
        {
            System.out.println(1);
            count++; //increments count
            method();
        }
    }
    catch ( WhosebugError e )
    {
      method();
    }
  }
}

你的问题是你不能在没有 if 或限制因素的情况下进行递归。在上面的代码中,我使用了一个计数来防止编码打印 infinity

记住任何时候使用递归它都必须有一个条件来告诉它什么时候停止

编辑:关于多行打印。这很可能是由于计算机打印速度无限快,以至于它在某些地方重叠

好奇地尝试处理您的代码,今天感觉胆大包天..

如果你在 catch 中添加一个 System.out.println(2); 你可以看到结果现在显示 1 正在单行打印,它来自 catch 的那些和触发错误的那些忽略从 println

移动的光标
static void method() {
    try {
        System.out.println(1);
        method();
    } catch (WhosebugError e) {
        System.out.println(2);
        method();
    }

}

输出:

1
1
122
122
1
122
122
1
1

同时,正如@khelwood 在 中所说,您不应该对忽略重复 WhosebugError 的程序有任何具体期望。任何事情都可能出错。

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

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