在循环中正确使用java.util.scanner?

时间:2015-07-02 19:29:08

标签: java

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();
    }
}

第一次通过循环一切都按预期工作。第二次循环我得到了:

  

线程中的异常" main" java.util.NoSuchElementException:找不到行       在java.util.Scanner.nextLine(Scanner.java:1540)       在家.MainMenu。(MainMenu.java:26)       at household.MyFirstGame.main(MyFirstGame.java:7)

我不确定如何"重置"扫描仪对象,以便能够再次重复使用它。

1 个答案:

答案 0 :(得分:0)

您的整个代码都在MainMenu的构造函数中,您通过调用menuIn.close();来关闭扫描程序,这是根本原因。

您似乎正在MainMenu内的main方法中创建MyFirstGame的新实例。现在,如果您在scanner对象上调用.close(),它将关闭基础流。因此,您的第一个对象成功创建。但是当您尝试实例化MainMenu的第二个对象时,由于System.in流已关闭,您会收到此异常。

理想情况下,您应该使用单个扫描仪对象来读取用户输入。不是每次都在构造函数中创建新的扫描程序对象,只需在main方法中创建一个扫描程序对象,并将其作为参数传递给构造函数。像下面的东西。

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();