2016-01-20 3 views
0

Итак, я программирую Snake в данный момент, и у меня есть метод для чтения целочисленного значения с консоли.
Когда мой метод вызывает ошибку - или по крайней мере, когда я возвращаюсь к этому методу - он не читает в новой строке из ввода, а просто передает пустую строку.
Вот мой код:JAVA: сканер не читает следующую строку // возвращает пустую строку

static int readInInt() 
{ 
    //We Read in the next line the user enters 
    String s = sc.nextLine(); 
    //x returns -1 if mistake happens 
    int x = -1; 

    try 
    { 
     //Now we try to parse that int 
     x = Integer.parseInt(s); 
     x = Math.abs(x); 
     System.out.println("Setting the speed to " + (x*100) + "ms."); 
    } 
    catch(NumberFormatException ex) 
    { 
     //If we can't parse it we try to get the ints with a regex and then parse it 
     System.out.println("Du hast eine nummer eingetippt die das System nicht analysieren kann."); 
     System.out.println("Das System probiert jetzt die Nummer die du eingetippt hast über umwege zu Analysieren."); 
     s = s.replaceAll("[^-?0-9]+", ""); 
     try 
     { 
      x = Integer.parseInt(s); 
     } 
     catch(Exception e) 
     { 
      //and if that doesnt work we just say Error! 
      System.out.println("Error Handling didn't work.\n" 
        + "Please try again with just a simple number (e.g. 7)");    
      //Return an Error in form of -1 
      return -1; 
     } 
     x = Math.abs(x); 
     System.out.println("Setting the speed to " + (x*100) + "ms."); 
    } 

    return x; 
} 

Я объявил «СБН» в качестве статического класса переменной static Scanner sc = new Scanner(System.in); в beginnning моей программы.

Почему сканер возвращает пустую строку? - без запроса ввода пользователя -
И да, я знаю метод .readNextInt, но мне легче справляться с такими исключениями.

+0

Показанный фрагмент кода выглядит нормально. Я предполагаю «проблему» в другой части вашего кода. Скорее всего, вы прочитали какой-то другой ввод с помощью 'sc.nextInt()' или аналогичного. Этот метод не уничтожает новую строку, которая вводится на консоли. Если вы затем перейдете к указанному методу, оператор 'String s = sc.nextLine()' будет непосредственно потреблять эту ожидающую новую строку, не дожидаясь появления какого-либо другого ввода. Вы тоже должны посмотреть на свой другой код. – Seelenvirtuose

+0

@Seelenvirtuose Спасибо за ответ. Bevor Я снова обращаюсь к этому методу, спрашиваю у пользователя, хочет ли он новую игру. (y/n ответ). И если он хочет новую игру, метод returnInt() снова получает доступ. Но это не должно быть проблемой. Eversicne i acces sc.nextLine() обрабатывает мою программу (меняя направление и т. Д.), Поэтому я не понимаю, почему это происходит в этой конкретной ситуации. –

+1

Я сказал, если в _another_ place 'sc .nextInt() ', у вас есть ожидающая новая строка, которая не была использована. Следующий 'sc.nextLine()' использует только эту новую строку и не дает приоритету ничего вводить. Поэтому проблема заключается в другой части вашего кода! – Seelenvirtuose

ответ

0

Спасибо @Seelenvirtuose, который привел меня на правильный путь решения!

I said, if in another place sc.nextInt() was used, you have a pending newline that was not consumed. The next sc.nextLine() only consumes this newline and does not give the priority to enter anything. The problem, therefore, is in another portion of your code! –

Решение было то, что в некоторых частях моего кода я использую sc.next(), который читает только в следующей строке недо пробел (если я не ошибаюсь), а не sc.nextLine().
Итак, я изменил все sc.next() на sc.nextLine(), но он не работает просто отлично.

Есть 2 другие решения, которые я нашел, делая след и ошибку:
а) Wrtie sc.reset(), который делает «Сброс сканера отбрасывает все его явной информации о состоянии [...]» бувигер экранным sc.nextLine() команда или
b) Просто создайте новый instanz Scanner класс.

Еще раз спасибо Seelenvirtuose.

Смежные вопросы