我有一个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();
}
}
}
答案 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()都会阻止应用程序并期望输入。此外,还有其他问题需要担心...就像其他人指出的那样。
我会坚持使用扫描仪。