2015-07-02 3 views
0
import java.util.Scanner; 

public class MainMenu { 

    public MainMenu(){ 

     int x = 1; 
     Scanner menuIn = new Scanner(System.in); 

     while (x == 1){ 

      String pick = "0"; 

      System.out.println("--== Household Admin v1.0 ==--"); 
      System.out.println("(A)dd Resident"); 
      System.out.println("(R)emove Resident"); 
      System.out.println("(L)ist Resident(s)"); 

      System.out.println("pick = " + pick); 

      System.out.print("#: "); 

      pick = menuIn.nextLine(); 

      System.out.println("pick = " + pick); 

      switch (pick) { 
       case "A": 
       case "a": 
         Resident.residentList.add(Resident.newResident()); 
         break; 
       case "R": 
       case "r": 
         break; 
       case "L": 
       case "l": 
         break; 
       case "Q": 
       case "q": 
         x = 0; 
         break; 
       default: 
         System.out.println("WRONG! Try again."); 
         break; 
      } 
     } 
     menuIn.close(); 
    } 
} 

Первый раз в цикле все работает так, как ожидалось. Второй раз Повсеместно цикл я получаю:Правильное использование java.util.scanner в цикле?

Исключение в потоке «основной» java.util.NoSuchElementException: Нет линии не найдено на java.util.Scanner.nextLine (Scanner.java:1540) в домашнем хозяйстве .MainMenu. (MainMenu.java:26) в household.MyFirstGame.main (MyFirstGame.java:7)

Я не знаю, как «сбросить» объект сканера, чтобы иметь возможность использовать его снова ,

+0

Ненужные но просто использовать 'true' в качестве условия в ваш цикл while. –

+0

Я не хотел этого делать, потому что я хотел дать возможность переключения для выхода. –

+0

Вы всегда можете использовать 'System.exit (0)' –

ответ

0

У вас есть весь код в конструкторе MainMenu, в котором вы закрываете сканер, вызывая menuIn.close();, что является основной причиной.

Кажется, вы создаете новые экземпляры MainMenu от main метод внутри MyFirstGame. Теперь, если вы вызываете .close() на объект сканера, он закрывает базовый поток. Таким образом, ваш первый объект создается успешно. Но когда вы пытаетесь создать экземпляр второго объекта MainMenu, вы получаете это исключение, так как поток System.in был закрыт.

В идеале вы должны использовать один объект сканера для чтения пользовательских входов. Вместо того чтобы каждый раз создавать новый объект сканера в конструкторе, просто создайте один объект сканера в основном методе и передайте его в качестве аргумента конструктору. Что-то вроде ниже.

внутри MyFirstGame.main

Scanner menuIn = new Scanner(System.in); 
MainMenu mainMenu1= new MainMenu(menuIn); 
MainMenu mainMenu2= new MainMenu(menuIn); 
//.... and So on 

//and close scanner object here once you have created all reaquired object. 
menuIn .close(); 

В вас MainMenu конструктор изменения в

public MainMenu(Scanner menuIn){  

и удалить ниже строки из конструктора

//Scanner menuIn = new Scanner(System.in); 
//menuIn.close(); 
Смежные вопросы