扫描程序 - 控制台菜单应用程序上的NoSuchElementException

时间:2015-04-20 09:00:12

标签: java

我正在使用Java进行一些测试来计算菜单驱动的控制台应用程序。

我有这段代码:

    public class TestClass {

    public static void main(String[] args) {

        int option = 99;

        do{
            System.out.println("1. one");
            System.out.println("2. two");
            System.out.println("3. three");
            System.out.println("0. END");

            Scanner scan = new Scanner(System.in);

            System.out.println("option : ");

            option=Integer.parseInt(scan.next());
            scan.close();
            switch (option) {
                case 0 :
                    System.exit(0);
                    break;
                case 1 :
                    caseOne();
                    break;
                case 2 :
                    caseTwo();
                    break;
                case 3 :
                    caseThree();
                    break;
                default :
                    break;

            }


        } while (option!=0);


    }

    private static void caseOne(){
        System.out.println("Case ONE");
    }

    private static void caseTwo(){
        System.out.println("Case TWO");
    }

    private static void caseThree(){
        System.out.println("Case THREE");
    }
}

当我运行它时效果很好。 我选择了一个选项并打印出" CASE X"。

奇怪的行为是DO循环重新开始的时候。 它再次显示菜单,但程序立即终止显示NoSuchElementException异常。 奇怪的是它既没有等我输入数字。

如果删除

scan.close();

声明它确实工作正常但编译器警告我内存泄漏,因为扫描永远不会关闭。

它表现得非常奇怪,因为在第一次通过"即使使用te scan.close(),一切都很好,但是在#34;第二遍"即使我正在创建一个新的Scanner对象,它也会崩溃,所以我认为它至少要求输入。

我真的对此感到困惑。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果您要关闭scanner,它也会关闭包裹input stream,这样您就可以在完成所有工作后关闭扫描。

scan.close();

将它放在do-while循环之后。

答案 1 :(得分:0)

这里有更好的方法来实现它

public static void main(String[] args) {

    int option = 99;

    do{
        System.out.println("1. one");
        System.out.println("2. two");
        System.out.println("3. three");
        System.out.println("0. END");

        Scanner scan = new Scanner(System.in);

        System.out.println("option : ");

        option= scan.nextInt();
        switch (option) {
            case 0 :
                System.exit(0);
                break;
            case 1 :
                caseOne();
                break;
            case 2 :
                caseTwo();
                break;
            case 3 :
                caseThree();
                break;
            default :
                scan.close();
                break;

        }


    } while (option!=0);


}