簡體   English   中英

為什么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 ( StackOverflowError e )
    {
      method();
    }
  }
}

輸出可能如下:

1
11111
1
11111
1
1
1
1
1
11111111
1
11111

然而,正如@khelwood在評論中所說,你不應該對忽略重復StackOverflowError的程序有任何特定的期望。 任何事都可能出錯。

但是,嘗試一個不太可能的解釋: System.out.println(1)包括打印1和平台特定的換行序列 - 在Windows上再次由打印\\r\\n 沒有什么能阻止兩者之間發生堆棧溢出或者在成功打印1之后嘗試打印換行符。 在這些情況下,下一個1 (如果成功)將打印在同一行。

您的輸出似乎顯示大約30 1和大約12(完整)換行符。 顯然,我描繪的場景發生的時間略多於一半。 如果這是正確的解釋,我們不知道。

好奇地嘗試着你的代碼,今天感覺Daredevilish ..

如果添加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
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或限制因素你不能做遞歸。 在上面的代碼中,我使用計數來防止編碼打印無限

記住任何時候使用遞歸它必須有條件告訴它什么時候停止

編輯:關於您在多行上的打印。 這很可能是由於計算機打印速度非常快,以至於它在某些地方重疊

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM