Java-错误消息未知原因

Java-错误消息未知原因,java,error-handling,while-loop,Java,Error Handling,While Loop,我对Java相当陌生,但对C和Python有些了解,因此有些Java看起来很像。我有一个运行良好的程序,直到我尝试创建一个“主菜单”。我在以前的语言中一直这样做,但是程序在循环中只工作一次,然后崩溃 发生错误的代码: while (true) { java.util.Scanner in = new java.util.Scanner(System.in); System.out.println("Alternative 1

我对Java相当陌生,但对C和Python有些了解,因此有些Java看起来很像。我有一个运行良好的程序,直到我尝试创建一个“主菜单”。我在以前的语言中一直这样做,但是程序在循环中只工作一次,然后崩溃

发生错误的代码:

while (true)
        {   
            java.util.Scanner in = new java.util.Scanner(System.in);

            System.out.println("Alternative 1. Add A New Person To Database");
            System.out.println("Alternative 2. Quit The Program");

            int choice = in.nextInt(); //This is where error is found! (:22)

            if (choice==1)
            {
                choice1();
            }
            if (choice==2)
            {
                System.out.println("Look at the file text.txt");
                System.exit(-1);
            }
        }
错误消息:

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at java.util.Scanner.nextInt(Unknown Source)
    at EgnaProgrammet.main(EgnaProgrammet.java:22)
我确信输入有问题,因为问题是在我第二次想输入时出现的。可能是因为
choice
已经有值了吗


感谢任何帮助

这个问题是重复的(可能还有一些其他问题)。所发生的情况是,在
while
循环的第一次迭代中,您正在使用
输入流中的
系统实例化一个
扫描仪
对象。在循环的每个后续迭代中,您将创建一个新的
扫描器
对象,然后关闭
输入流中的
系统

将代码更改为:

// declare your Scanner only once, *outside* the while loop
java.util.Scanner in = new java.util.Scanner(System.in);
System.out.println(System.in.available());

while (true) {
    System.out.println("Alternative 1. Add A New Person To Database");
    System.out.println("Alternative 2. Quit The Program");

    int choice = in.nextInt(); //This is where error is found! (:22)

    if (choice == 1) {
        choice1();

    } else if (choice == 2) {
        System.out.println("Look at the file text.txt");
        System.exit(-1);
    }
}

这个问题是重复的(可能还有一些其他问题)。所发生的情况是,在
while
循环的第一次迭代中,您正在使用
输入流中的
系统实例化一个
扫描仪
对象。在循环的每个后续迭代中,您将创建一个新的
扫描器
对象,然后关闭
输入流中的
系统

将代码更改为:

// declare your Scanner only once, *outside* the while loop
java.util.Scanner in = new java.util.Scanner(System.in);
System.out.println(System.in.available());

while (true) {
    System.out.println("Alternative 1. Add A New Person To Database");
    System.out.println("Alternative 2. Quit The Program");

    int choice = in.nextInt(); //This is where error is found! (:22)

    if (choice == 1) {
        choice1();

    } else if (choice == 2) {
        System.out.println("Look at the file text.txt");
        System.exit(-1);
    }
}

您必须有扫描仪的下一行。我想这篇文章会对你有所帮助

扫描仪还有一个方法“hasNext()”,您可以像这样使用它:

while(scanner.hasNext()){
// do sth
}

您必须有扫描仪的下一行。我想这篇文章会对你有所帮助

扫描仪还有一个方法“hasNext()”,您可以像这样使用它:

while(scanner.hasNext()){
// do sth
}


我的输入是1或2。只有那些。请注意,在第一个“循环”中它工作正常。问题第二次出现。您应该使用Scanner类中的hasNextXXXX()方法来确保有一个整数可以读取。请检查此链接。此外,您应该只使用一个扫描仪实例,而不是在每次迭代时创建一个新的实例。@KevinEsche您的评论是问题的根本原因。但是是的,他也应该有一些逻辑来处理非整数输入。他将检查链接并尝试解决它。至于输入处理,我会在这个问题解决后再做。一步一个脚印!:)我的输入是1或2。只有那些。请注意,在第一个“循环”中它工作正常。问题第二次出现。您应该使用Scanner类中的hasNextXXXX()方法来确保有一个整数可以读取。请检查此链接。此外,您应该只使用一个扫描仪实例,而不是在每次迭代时创建一个新的实例。@KevinEsche您的评论是问题的根本原因。但是是的,他也应该有一些逻辑来处理非整数输入。他将检查链接并尝试解决它。至于输入处理,我会在这个问题解决后再做。一步一个脚印!:)我以前有过这个,但当遇到问题时,我决定将它放在里面,并在底部添加“in.close();”。但我意识到这不是问题所在,所以我可能应该把它带到外面去。我认为这是问题所在。当运行我的代码时,你会得到什么错误消息?把它放在外面没有什么区别(除了我不会每次都浪费资源调用它),因此我会得到相同的错误。问题似乎和其他人描述的一样。现在将尝试这样做尝试在创建
扫描仪后立即添加这行代码:
System.out.println(System.in.available())我以前有过这个,但当遇到问题时,我决定将它放在里面,并在底部添加了“in.close();”。但我意识到这不是问题所在,所以我可能应该把它带到外面去。我认为这是问题所在。当运行我的代码时,你会得到什么错误消息?把它放在外面没有什么区别(除了我不会每次都浪费资源调用它),因此我会得到相同的错误。问题似乎和其他人描述的一样。现在将尝试这样做尝试在创建
扫描仪后立即添加这行代码:
System.out.println(System.in.available())