0

我有一个 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();
            }
        }
    }
4

3 回答 3

3

从java文档中,当使用类的next()方法时Scanner,你会得到

NoSuchElementException - if no such tokens are available

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

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

try {
   while (guess > 0) {
       while (.....) {
           .....
       }
   }
} catch (...){
   ....
  }
finally{ .... }
于 2012-07-31T16:18:25.480 回答
1

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

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

于 2012-07-31T16:06:50.903 回答
0

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

不过我会坚持使用扫描仪。

于 2012-07-31T16:12:05.500 回答