为什么多次调用 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 ( WhosebugError e )
{
method();
}
}
}
输出可能如下:
1
11111
1
11111
1
1
1
1
1
11111111
1
11111
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 ( WhosebugError e )
{
method();
}
}
}
你的问题是你不能在没有 if 或限制因素的情况下进行递归。在上面的代码中,我使用了一个计数来防止编码打印 infinity
记住任何时候使用递归它都必须有一个条件来告诉它什么时候停止
编辑:关于多行打印。这很可能是由于计算机打印速度无限快,以至于它在某些地方重叠
好奇地尝试处理您的代码,今天感觉胆大包天..
如果你在 catch
中添加一个 System.out.println(2);
你可以看到结果现在显示 1 正在单行打印,它来自 catch 的那些和触发错误的那些忽略从 println
移动的光标
static void method() {
try {
System.out.println(1);
method();
} catch (WhosebugError e) {
System.out.println(2);
method();
}
}
输出:
1
1
122
122
1
122
122
1
1
同时,正如@khelwood 在 中所说,您不应该对忽略重复 WhosebugError
的程序有任何具体期望。任何事情都可能出错。
然而,尝试一个不太可能的解释:System.out.println(1)
包括打印 1
和特定于平台的换行序列 — 在 Windows 上再次包括打印 \r
和 \n
。没有什么可以阻止堆栈溢出发生在两者之间,或者在 1
成功打印后尝试打印换行符时。在这些情况下,下一个 1
(如果成功)将打印在同一行上。
您的输出似乎显示了大约 30 个 1
和大约 12 个(完整的)换行符。所以很明显,我勾画的情景发生了一半多一点。 如果这是正确的解释,我们不知道。
这只是一个有趣的问题。不是真正的生产代码。 我不想修理它。我只想了解这种奇怪的行为。 我有应该在每一行中打印“1”的代码。实际上,这是错误的。我在一行中得到了像“11111111”这样的奇怪结果。
class Scratch
{
public static void main( String[] args )
{
method();
}
static void method()
{
try
{
System.out.println(1);
method();
}
catch ( WhosebugError e )
{
method();
}
}
}
输出可能如下:
1
11111
1
11111
1
1
1
1
1
11111111
1
11111
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 ( WhosebugError e )
{
method();
}
}
}
你的问题是你不能在没有 if 或限制因素的情况下进行递归。在上面的代码中,我使用了一个计数来防止编码打印 infinity
记住任何时候使用递归它都必须有一个条件来告诉它什么时候停止
编辑:关于多行打印。这很可能是由于计算机打印速度无限快,以至于它在某些地方重叠
好奇地尝试处理您的代码,今天感觉胆大包天..
如果你在 catch
中添加一个 System.out.println(2);
你可以看到结果现在显示 1 正在单行打印,它来自 catch 的那些和触发错误的那些忽略从 println
static void method() {
try {
System.out.println(1);
method();
} catch (WhosebugError e) {
System.out.println(2);
method();
}
}
输出:
1
1
122
122
1
122
122
1
1
同时,正如@khelwood 在 WhosebugError
的程序有任何具体期望。任何事情都可能出错。
然而,尝试一个不太可能的解释:System.out.println(1)
包括打印 1
和特定于平台的换行序列 — 在 Windows 上再次包括打印 \r
和 \n
。没有什么可以阻止堆栈溢出发生在两者之间,或者在 1
成功打印后尝试打印换行符时。在这些情况下,下一个 1
(如果成功)将打印在同一行上。
您的输出似乎显示了大约 30 个 1
和大约 12 个(完整的)换行符。所以很明显,我勾画的情景发生了一半多一点。 如果这是正确的解释,我们不知道。