Почему множественные вызовы System.out.println выводят значения в одну строку - PullRequest
3 голосов
/ 14 марта 2019

Это просто забавный вопрос.Не настоящий код для производства.Я не хочу это исправить.Я просто хочу понять это странное поведение.У меня есть код, который должен напечатать «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

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

Хотя, как сказал @khelwood в комментарии , у вас не должно быть никаких особых ожиданий от программы, которая игнорирует повторяющиеся StackOverflowError с. О чем угодно может пойти не так.

Однако попытка не слишком маловероятного объяснения: System.out.println(1) состоит из печати 1 и последовательности новой строки для конкретной платформы - в Windows, снова состоящей из печати \r и \n. Ничто не мешает переполнению стека произойти между ними или при попытке напечатать новую строку после успешной печати 1. В этих случаях следующая 1 (в случае успеха) будет напечатана в той же строке.

Ваш вывод показывает около 30 1 и около 12 (полных) новых строк. Таким образом, очевидно, что сценарий, который я набросал, происходил чуть более половины раз. Если , то это правильное объяснение, которого мы не знаем.

0 голосов
/ 14 марта 2019

Любопытно пытался поработать над твоим кодом, чувствуя себя сегодня как смельчак ..

Если вы добавите 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
0 голосов
/ 14 марта 2019
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 или ограничения.В приведенном выше коде я использую счетчик, чтобы запретить печать кода бесконечности

Помните, что при любом использовании рекурсии должно быть условие, указывающее, когда нужно останавливаться

РЕДАКТИРОВАТЬ: Что касается вашегопечать в несколько строк.Скорее всего, это связано с тем, что компьютер печатает бесконечно быстро и местами

...