这只是一个有趣的问题。不是真正的生产代码。 我不想修复它。我只想了解这种奇怪的行为。 我有应该在每行中打印“ 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
答案 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或限制因素,您将无法进行递归。在上面的代码中,我使用了一个计数来防止代码打印无穷大
记住,每次使用递归时,都必须有一个条件来告知何时停止
编辑:关于多行打印。很有可能是由于计算机无限快地打印,使其在某些地方重叠