线程“main”java.util.NoSuchElementException中的异常

时间:2013-03-13 23:50:28

标签: java exception java.util.scanner

每当我运行它时,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

5 个答案:

答案 0 :(得分:10)

您关闭了关闭基础Scanner的第二个InputStream,因此第一个Scanner无法再从相同的InputStreamNoSuchElementException结果中读取

解决方案:对于控制台应用,请使用一个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更专业,并且仅与基于列表的集合(例如ArrayListLinkedList)一起使用,等等。但是,ListIterator通过允许迭代通过hasPrevious()previous()方法在两个方向上遍历而增加了更多功能。