这只是一个有趣的问题。不是真正的生产代码。我不想修复它。我只想理解这种奇怪的行为。我的代码应在每行中打印" 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上再次由打印r
和n
组成。没有什么可以阻止两者之间或在成功打印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
请记住,任何时间都使用递归,都必须有一个条件才能告诉它何时停止
编辑:至于您在多行上打印。这很可能是由于计算机打印的速度足够快,以至于它与位置重叠