2015-01-20 3 views
0

У меня есть следующий код, но после первого цикла мой отладчик дает следующие ошибки: это странно, я делал это все время, но это больше не работает, это довольно странно ?! Я проверил его шаг за шагом, он просто остановился после заказа переключателя?java.lang.IllegalStateException: Сканер закрыт

Exception in thread "main" java.lang.IllegalStateException: Scanner closed 
     at java.util.Scanner.ensureOpen(Unknown Source) 
     at java.util.Scanner.findWithinHorizon(Unknown Source) 
     at java.util.Scanner.nextLine(Unknown Source) 
     at Level.schleife(Level.java:35) 
     at Crawler.main(Crawler.java:23) 

public boolean schleife() { 
    System.out.println("Das Spiel beginnt, bewege Dich mit der WASD Steuerung!"); 
    Scanner eingabeMove = new Scanner(System.in); 

    tmpi = positioni; 
    tmpj = positionj; 
    while (true) { 
     String bewegung = eingabeMove.nextLine(); 
     switch (bewegung) { 
      case "w": {          // vorwärts 
       tmpi += 1; 
       if (actionResult()) { 
        positioni = tmpi; 
        break; 
       } else { 
        return false; 
       } 
      } 
      case "a": {         // links 
       tmpj -= 1; 
       if (actionResult()) { 
        positionj = tmpj; 
        break; 
       } else { 
        return false; 
       } 
      } 
      case "s": {         // rückwärts 
       tmpi -= 1; 
       if (actionResult()) { 
        positioni = tmpi; 
        break; 
       } else { 
        return false; 
       } 
      } 
      case "d": {         // rechts 
       tmpj += 1; 
       if (actionResult()) { 
        positionj = tmpj; 
        break; 
       } else { 
        return false; 
       } 
      } 
      default: {         // falsche Eingabe 
       System.out.println("Falsche Eingabe!"); 
       continue; 
      } 
     } 
     eingabeMove.close(); 
    } 
} 
+0

движение 'eingabeMove.close()' вниз 3 линии вне контура. – ControlAltDel

ответ

1

Не называйте eingabeMove.close(); в конце этого while цикла. Вы вызываете сканер в неработоспособном состоянии в конце первого цикла.

Поскольку цикл всегда заканчивается return, нет смысла закрывать сканер в этом методе schleife().

На самом деле вам не нужно закрывать сканер, потому что он обертывает System.in, который никогда не закрывается. Учитывая этот факт, вы можете просто позволить eingabeMove выйти из сферы действия, когда возвращается schleife().

Если вы действительно хотите закрыть сканер, вы должны передать eingabeMove в качестве параметра методу и закрыть его из вызывающего метода.

public boolean schleife(Scanner eingabeMove) { 
    // use the scanner 
} 

телефонный код:

Scanner eingabeMove = new Scanner(System.in); 
schleife(eingabeMove); 
eingabeMove.close(); 
+0

на самом деле его нужно называть, всего лишь на 1 строку за пределами фигурных скобок – ControlAltDel

+0

@ControlAltDel спасибо, я поймал, что после того, как он сделал редактирование, чтобы включить весь метод – gknicker

+0

Фактически, если вы переместите 'close' вне цикла while, это никогда не будет вызван, поскольку единственный способ оставить цикл - одним из операторов return. – Eran

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