繁体   English   中英

为什么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 ( StackOverflowError e )
    {
      method();
    }
  }
}

输出可能如下:

1
11111
1
11111
1
1
1
1
1
11111111
1
11111

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

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

您的输出似乎显示大约30 1和大约12(完整)换行符。 显然,我描绘的场景发生的时间略多于一半。 如果这是正确的解释,我们不知道。

好奇地尝试着你的代码,今天感觉Daredevilish ..

如果添加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
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 ( StackOverflowError e )
    {
      method();
    }
  }
}

你的问题是没有if或限制因素你不能做递归。 在上面的代码中,我使用计数来防止编码打印无限

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM