每当我运行它时,chooseCave()
函数与in.nextInt()
一起运行正常。当我选择洞穴时,消息会以2秒的间隔弹出,然后一旦超过该部分,就会出现错误:
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at Dragon.main(Dragon.java:81)
我尝试了hasNextLine()
和hasNextInt()
,当我在while hasNextLine()
方法中使用main
时,我收到了更多错误。当我在while hasNextInt()
方法中使用chooseCave()
时,它不接受我的输入。
当我在if hasNextInt()
方法中使用chooseCave()
时,它不接受我对playAgain
字符串的输入,直接进入另一个游戏,但随后是{{1} } boolean返回hasNextInt()
并且无限地发送“哪个洞穴......”。
我已经完成了错误报告以及类似问题的Java-docs和Stack Overflow。请帮忙。
false
答案 0 :(得分:10)
您关闭了关闭基础Scanner
的第二个InputStream
,因此第一个Scanner
无法再从相同的InputStream
和NoSuchElementException
结果中读取
解决方案:对于控制台应用,请使用一个Scanner
来阅读System.in
。
旁白:如上所述,请注意Scanner#nextInt
不会使用换行符。在尝试使用nextLine
再次致电Scanner#newLine()
之前,请确保使用这些内容。
请参阅:Do not create multiple buffered wrappers on a single InputStream
答案 1 :(得分:6)
nextInt()
方法离开\n
(结束行)符号,并由nextLine()
立即拾取,跳过下一个输入。你想要做的是使用nextLine()
作为一切,并在以后解析它:
String nextIntString = keyboard.nextLine(); //get the number as a single line
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int
这是迄今为止避免问题的最简单方法 - 不要混淆“下一步”方法。仅使用nextLine()
然后解析int
或之后单独的单词。
另外,如果您只使用一个终端进行输入,请确保只使用一个Scanner
。这可能是例外的另一个原因。
最后注意:将String
与.equals()
函数进行比较,而不是==
运算符。
if (playAgain == "yes"); // Causes problems
if (playAgain.equals("yes")); // Works every time
答案 2 :(得分:1)
Reimeus是对的,你可以在 chooseCave()中看到 in.close 。 而且,这是错误的。
if (playAgain == "yes") {
play = true;
}
您应该使用equals而不是“==”。
if (playAgain.equals("yes")) {
play = true;
}
答案 3 :(得分:0)
根本不要关闭
从您的代码中删除in.close()
。
答案 4 :(得分:0)
每个人对此的解释都很好。让我回答何时使用此类。
何时应使用NoSuchElementException?
Java包括几种不同的方法来遍历集合中的元素。其中的第一个类Enumeration是在JDK1.0
中引入的,通常认为它已被弃用,而支持较新的迭代类,例如Iterator和ListIterator。
与大多数编程语言一样,Iterator类包含一个hasNext()
方法,该方法返回一个布尔值,该布尔值指示该迭代是否还有其他元素。如果hasNext()
返回true
,则next()
方法将返回迭代中的下一个元素。与Enumeration不同,Iterator还具有remove()
方法,该方法将删除通过next()
获得的最后一个元素。
虽然Iterator被普遍用于Java Collections Framework
中的所有集合,但是ListIterator
更专业,并且仅与基于列表的集合(例如ArrayList
,LinkedList
)一起使用,等等。但是,ListIterator
通过允许迭代通过hasPrevious()
和previous()
方法在两个方向上遍历而增加了更多功能。