线程“main”java.util.NoSuchElementException中的exception
每当我运行它时, chooseCave()
函数与chooseCave()
正常工作。 当我选择洞穴时,消息会以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()
,当我在main
方法中使用while hasNextLine()
时,我得到了更多的错误。 当我在chooseCave()
方法中使用while hasNextInt()
时,它不接受我的输入。
当我在chooseCave()
方法中使用if hasNextInt()
时,它不接受我对playAgain
字符串的输入,并直接进入另一个游戏,但是然后hasNextInt()
布尔返回false
并且它发送“哪个洞穴… 。“ 无限地。
我已经完成了错误报告以及类似问题的Java-docs和Stack Overflow。 请帮忙。
import java.util.Scanner; public class Dragon { public static void displayIntro() { System.out.println("You are in a land full of dragons. In front of you, "); System.out.println("You see two caves. In one cave, the dragon is friendly"); System.out.println("and will share his treasure with you. The other dragon"); System.out.println("is greedy and hungry, and will eat you on sight"); System.out.println(' '); } public static int chooseCave() { Scanner in = new Scanner(System.in); int cave = 0; while (cave != 1 && cave != 2) { System.out.println("Which cave will you go into? (1 or 2)"); cave = in.nextInt(); } in.close(); return cave; } public static void checkCave(int chosenCave) { System.out.println("You approach the cave..."); try { // Sleep at least n milliseconds. // 1 millisecond = 1/1000 of a second. Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println( "awakened prematurely" ); } System.out.println("It is dark and spooky..."); try { // Sleep at least n milliseconds. // 1 millisecond = 1/1000 of a second. Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println( "awakened prematurely" ); } System.out.println("A large dragon jumps out in front of you! He opens his jaws and..."); try { // Sleep at least n milliseconds. // 1 millisecond = 1/1000 of a second. Thread.sleep( 2000 ); } catch ( InterruptedException e ) { System.out.println( "awakened prematurely" ); } double friendlyCave = Math.ceil(Math.random() * 2); if (chosenCave == friendlyCave) { System.out.println("Gives you his treasure!"); } else { System.out.println("Gobbles you down in one bite!"); } } public static void main(String[] args) { Scanner inner = new Scanner(System.in); String playAgain = "yes"; boolean play = true; while (play) { displayIntro(); int caveNumber = chooseCave(); checkCave(caveNumber); System.out.println("Do you want to play again? (yes or no)"); playAgain = inner.nextLine(); if (playAgain == "yes") { play = true; } else { play = false; } } inner.close(); } }
关闭第二个关闭底层InputStream
的Scanner
,因此第一个Scanner
无法再读取相同的InputStream
和NoSuchElementException
结果。
解决方案:对于控制台应用程序,使用单个Scanner
从System.in
读取。
旁白:如前所述,请注意Scanner#nextInt
不会使用换行符。 在尝试使用Scanner#newLine()
再次调用nextLine
之前,请确保使用这些消耗。
请参阅: 不要在单个InputStream上创建多个缓冲包装器
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
Reimeus是对的,你看到这是因为你的chooseCave()中的in.close 。 而且,这是错误的。
if (playAgain == "yes") { play = true; }
您应该使用equals而不是“==”。
if (playAgain.equals("yes")) { play = true; }
根本就不要靠近
从代码中删除in.close()
。
- 索引越界错误
- 如何通过DocumentBuidlerFactory创建新的xml文件时生成ParserConfigurationException
- 为什么用户定义的exception类在java中是首选/重要的?
- Javaexception处理的良好实践
- AsycTask抛出IllegalStateException – 片段未附加到活动
- 为什么hibernate将HibernateException更改为(未选中)RuntimeException
- java.lang.ArrayIndexOutOfBoundsException:length = 4; index = 4长度数组
- Java:密码包(加密和解密)。 无效的密钥错误
- EJB3.1系统exception与javax.ejb.EJBException