Java多个switch语句 - NoSuchElementException

时间:2016-08-21 19:04:41

标签: java loops exception switch-statement

目前,我正在使用switch语句。当我有多个带有switch语句的循环时,我遇到了一个问题。

当我退出第二个switch语句(向上一个)时,Java会抛出java.util.NoSuchElementException,我不太清楚为什么会这样做

switchOne = sc.nextInt(); 

应该触发新的用户输入?

我希望有人可以帮助我对此有所了解。 我还尝试使用scanner而不使用try-with-resources,但它也会出现同样的错误。

public static void main(String[] args) {

    int switchOne = 0;
    int switchTwo = 0;

    boolean breakAdmin = false;

    try(Scanner sc = new Scanner(System.in)) {

        while(true) {
            System.out.println("Select one of the options below");
            System.out.println("1: Browse books");
            System.out.println("2: Get a coffe");
            System.out.println("3: See previously checkouts");
            System.out.println("0: Exit");
            System.out.print("Option: ");

            switchOne = sc.nextInt();

            switch(switchOne) {
                case 0:
                    return;
                case 1:
                    System.out.println("!!You choose to browse over books, woohoo!!");
                    break;
                case 2:
                    System.out.println("!!Sit & relax");
                    break;
                case 3:
                    System.out.println("!!Let me get that list for you");
                    break;
                case 99:
                    System.out.println("We welcome you!");

                    try(Scanner sc2 = new Scanner(System.in)) {
                        while(!breakAdmin) {
                            System.out.println("0: exit");
                            System.out.println("1: something");

                            switchTwo = sc2.nextInt();

                            switch(switchTwo) {
                            case 0:
                                breakAdmin = true;
                                break;
                            case 1:
                                System.out.println("!!admin 1");
                                break;
                            default:
                                System.out.println("!!This is the default case");
                                break;
                            }
                        }
                    }
                    breakAdmin = false;
                    break;// case 99 ends
                default:
                    System.out.println("!!This is the default case");
                    break;
            } // switch block ends
        } // while loop ends
    } // try with resources ends
}

1 个答案:

答案 0 :(得分:3)

try(Scanner sc2 = new Scanner(System.in)) {

try-with-resources构造关闭在try on exit中创建的资源,因此它调用sc2.close()然后关闭System.in

在此之后,您尝试从另一个sc读取,该System.in尝试从try读取。但由于已经关闭,因此不再需要阅读。

要修复只需删除第二个Scanner.readLine(),就不需要关闭在那里创建的扫描仪。

编辑:另一个潜在的问题是输入流包含一个未被清除的非数字(例如换行符),因为它无法将其解释为一个数字,它将抛出声明的异常。处理用户输入时,最好只读取整行Integer.parseInt(...)并自行转换输入,例如使用QGridLayout