为什么要在单行中打印多个呼叫



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

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 s的程序不应有任何特定期望。关于任何事情可能会出错。

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

您的输出似乎显示约30 1和大约12个(完整)新线。因此,显然,我素描的情况发生了一半以上。如果这是我们不知道的正确解释。

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

如果在catch中添加了System.out.println(2);,您可以看到结果现在表明1分在单行中,其捕获量和触发错误的错误忽略了光标从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或限制因素的情况下进行递归。在上面的代码中,我使用计数来防止编码打印Infinity

请记住,任何时间都使用递归,都必须有一个条件才能告诉它何时停止

编辑:至于您在多行上打印。这很可能是由于计算机打印的速度足够快,以至于它与位置重叠

最新更新