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

时间:2019-03-14 14:57:36

标签: java stack-overflow println

这只是一个有趣的问题。不是真正的生产代码。 我不想修复它。我只想了解这种奇怪的行为。 我有应该在每行中打印“ 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

3 个答案:

答案 0 :(得分:3)

正如@khelwood在a comment中所说,尽管您对忽略重复的StackOverflowError的程序不抱有任何特定的期望。几乎任何事情都可能出错。

但是,尝试进行不太可能的解释是:System.out.println(1)包括打印1和特定于平台的换行符序列-在Windows上又包括打印\r和{ {1}}。不能阻止两者之间的堆栈溢出,也不能阻止\n成功打印之后尝试打印换行符。在这种情况下,下一个1(如果成功)将打印在同一行上。

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

答案 1 :(得分:0)

好奇地尝试处理您的代码,今天感到胆怯。

如果您在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

答案 2 :(得分:-2)

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或限制因素,您将无法进行递归。在上面的代码中,我使用了一个计数来防止代码打印无穷大

记住,每次使用递归时,都必须有一个条件来告知何时停止

编辑:关于多行打印。很有可能是由于计算机无限快地打印,使其在某些地方重叠

相关问题