Java Scanner奇怪的行为

时间:2012-07-31 15:59:58

标签: java

我有一个java扫描程序和两个循环来处理用户输入,但是它会在第二个响应第一个循环时抛出NoSuchElement异常而不询问用户的任何输入。

Scanner Guess_input = new Scanner( System.in );


    while (guess > 0){
        failure = true;
        while(failure)
        {

            System.out.println("Please input");
            try
            {
                if (Guess_input.nextLine().length() == 1 && guesses.size() >= 1) {
                    guesses.add(Guess_input.nextLine());
                    System.out.println("You guessed" + guesses.get(guesses.size()) + "");
                }
                else if (Guess_input.nextLine().length() == 0) {
                    System.err.println("ERROR:");
                    Guess_input.nextLine();   //Clean Buffer
                    failure = true;
                }
                else 
                {
                    System.err.println("ERROR");
                    Guess_input.nextLine();   //Clean Buffer
                    failure = true;
                }
            }   
            catch(InputMismatchException ime)

            {
                System.err.println("error");
            }
            finally
            {
                Guess_input.close();
            }
        }
    }

3 个答案:

答案 0 :(得分:2)

从java文档中,当使用next()类的Scanner方法时,您将获得

NoSuchElementException - if no such tokens are available

每当您调用nextLine()方法时,您都应该输入String。您应该首先将nextLine()的结果存储在局部变量中,除非这是您想要的。

另一个问题是,try catch finally已完成while loop。这意味着对于每次迭代,每次都会执行finally块,因此您会认为存在异常,而可能没有异常。应用这些更改

try {
   while (guess > 0) {
       while (.....) {
           .....
       }
   }
} catch (...){
   ....
  }
finally{ .... }

答案 1 :(得分:1)

错误陈述是guesses.get(guesses.size())。在Java列表中使用从零开始的索引,即第一个元素的索引始终为0,最后一个元素为size - 1.根据定义,列表的大小是无效索引。

在将其添加到列表之前,您可能应该在其自己的变量中保留下一行,以便您的sysout语句可以仅引用该变量,而不是将值从列表中拉回。但简单的解决方案是将代码更改为guesses.get(guesses.size() - 1)

答案 2 :(得分:0)

你太多次调用guesses.nextLine()了。每次调用nextLine()都会阻止应用程序并期望输入。此外,还有其他问题需要担心...就像其他人指出的那样。

我会坚持使用扫描仪。