扫描程序错误,我无法弄清楚:NoSuchElementException

时间:2012-11-04 22:44:50

标签: java exception java.util.scanner

它在do-while循环中的第三行崩溃,并且不等待我的输入:

 input = kb.nextInt();

堆栈追踪:

  

线程“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)

     

在main.MainDriver.main(MainDriver.java:50)

相关代码:

do
    {
        displayFullMenu();
        System.out.print("Selection: ");
        input = kb.nextInt();

        switch (input)
        {
        //Create new survey
        case 1:     currentSurvey = new Survey();
                    break;

        //Display current survey            
        case 2:     currentSurvey.display();
                    break;

        //Save current survey           
        case 3:     saveSurvey(currentSurvey);
                    break;

        //Load a survey
        case 4:     currentSurvey = loadSurvey();
                    break;

        //Modify a survey
        case 5:     currentSurvey.modify();
                    break;

        /*******************Test Functions*******************/

        //Create new test
        case 6:     currentSurvey = new Test();
                    break;

        //Display current test
        case 7:     currentSurvey.display();
                    break;

        //Save current test
        case 8:     saveSurvey(currentSurvey);
                    break;

        //Load a test
        case 9:     currentSurvey = loadTest();
                    break;

        //Modify a test
        case 10:    currentSurvey.modify();

        default:    System.out.println("Invalid choice. Please make a valid choice: ");
                    input = kb.nextInt();
                    System.out.println();
        }
    } while (input != 99);
    kb.close();

选择选项9后崩溃。它正确保存文件,然后返回循环顶部,并在前面提到的行崩溃。我希望它要求更多的意见。

是什么给出了?

2 个答案:

答案 0 :(得分:3)

  

当我选择选项8时,在saveSurvey()中,它必须创建一个新的Scanner(在该方法中),因为所有这些都在我的main方法中。这可能是问题吗?

是的,这可能是问题所在。如果Scanner具有与System.in相同的来源(kb?)且close() d,则会关闭基础流,并且kb无法再获取输入

答案 1 :(得分:1)

我明白了。

整个问题是由于我没有在main中创建静态扫描程序 - 当我在main之外的其他方法中需要它时,我创建了新的。

而不是

public class MainDriver
{
    public static Scanner kb = new Scanner(System.in);
    public void main(String[] args) throws IOException 
   {

我有:

public class MainDriver
{
    public static void main(String[] args) throws IOException 
    {
        public static Scanner kb = new Scanner(System.in);

然后在其他方法中创建新的扫描仪。在这些方法的最后,我关闭了扫描仪。我猜它正在关闭本地扫描程序,因为当我摆脱其他方法中的所有close()语句时,问题就消失了。