什么是在循环中创建Scanner对象时关闭它的正确时间?

时间:2015-02-07 06:15:08

标签: java reference java.util.scanner

我正在编写一个程序,要求用户通过在控制台中输入来从菜单中进行选择。

我是stackoverflow和java的新手,并且通过尽可能具体来安全地播放它。如果你发现它很冗长,请原谅。

我用enter" B"测试了代码。在提示时,情况是第一次迭代很好,但是当第二次迭代时,程序不再阻止输入并在控制台中给出以下错误消息(你可以在用星号评论后找到bug生成的地方) :

Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at MainClass.main(MainClass.java:32)

public class MainClass {

    public static void main(String[] args) {



        AirlineClass theAirline = AirlineClass();
        boolean stopAsking = false;

        while (!stopAsking){
        // display the menu
        String menuContent = "A. Print List of all passengers.\n"
                + "B. Print List of flights.\n"
                + "C. Add a passenger to a flight.\n"
                + "D. Remove a passenger from a flight.\n"
                + "E. Print a List of passengers on a flight.\n"
                + "F. Exit.\n"
                + "Please enter your choice: ";
        System.out.println(menuContent);

        //create a Scanner object for input
        Scanner reader = new Scanner(System.in);
        String choice = reader.next().toUpperCase();




        //*********************************
        // bug here
        reader.close();


        switch (choice) {
        case "A": 
            break;
        case "B":
            System.out.println("You have chose B");
            break;
        case "C":
            break;
        case "D":
            break;
        case "E":
            break;
        case "F":
            System.out.println("Program exits, bye~");
            stopAsking = true;
            reader.close();
            break;
        default:
            System.out.println("Invalid input detected, please try again");
            reader.close();
            break;
        }
    }       
}

删除行reader.close()后,程序运行正常。

我认为一个可能的原因可能是: 如果我reader.close(),那么我创建的名称为reader的每个扫描器对象都被视为已关闭。

如果有人能帮助我,我真的非常感激。如果我在提问的方式上犯了一些错误,请指出。

2 个答案:

答案 0 :(得分:0)

Scanner的创建移到循环之外并同样关闭。所以你可以在每次迭代中重用相同的对象

Scanner reader = new Scanner(System.in);
String choice;
boolean stopAsking = false;
while (!stopAsking) {
    // print menu
    // read data

    choice = reader.next().toUpperCase();

    // switch block with stopAsking = true;
}
reader.close();

答案 1 :(得分:0)

您应该在循环之前创建Scanner,这样您每次需要获取用户输入时都可以使用相同的对象。

此外,Scanner(System.in)个对象不一定是close() d,因为close()也会关闭System.in流。在使用close()时忘记Scanner(System.in),你会没事的。有关详细信息,请查看答案here