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

2022-09-03 17:18:07

每当我运行此函数时,该函数都可以与.当我选择洞穴时,消息以2秒的间隔弹出,然后一旦它通过该部分,它就会给我错误:chooseCave()in.nextInt()

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()mainwhile hasNextInt()chooseCave()

当我在方法中使用时,它不接受我对字符串的输入,并直接进入另一个游戏,但随后布尔返回并发送垃圾邮件“哪个洞穴...”无限。if hasNextInt()chooseCave()playAgainhasNextInt()false

我已经浏览了错误报告以及Java文档和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();

}

}

答案 1

您关闭第二个关闭底层,因此第一个无法再读取相同的结果。ScannerInputStreamScannerInputStreamNoSuchElementException

解决方案:对于控制台应用,请使用单个应用程序从 中读取。ScannerSystem.in

旁白:如前所述,请注意,它不使用换行符。确保在尝试使用 再次调用之前已使用这些内容。Scanner#nextIntnextLineScanner#newLine()

请参见: 不要在单个输入流上创建多个缓冲包装器


答案 2

该方法离开(结束线)符号,并立即被 拾取,跳过下一个输入。您要做的是用于所有内容,并在以后解析它:nextInt()\nnextLine()nextLine()

String nextIntString = keyboard.nextLine(); //get the number as a single line
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int

这是迄今为止避免问题的最简单方法 - 不要混合你的“下一个”方法。仅使用,然后解析 s 或单独的单词。nextLine()int


另外,如果您只使用一个终端进行输入,请确保只使用一个。这可能是例外的另一个原因。Scanner


最后注意:将 a 与函数进行比较,而不是运算符。String.equals()==

if (playAgain == "yes"); // Causes problems
if (playAgain.equals("yes")); // Works every time