线程“main”中的 Java 异常

ham*_*dan 0 java java.util.scanner

我编写了一个简单的程序,它生成 1 到 100 之间的随机数,并要求用户输入 1 到 100 之间的数字。如果该数字大于随机数,则会显示一条消息,说明它大于随机数,并且如果小于则显示相反的结果。用户只有 10 次机会猜出正确的数字。这是代码:

import java.util.Scanner;

public class Program {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int random_num = (int) (Math.random() * 100) + 1;

        System.out.println("guess a number between 1 and 100");

        boolean isCorrect = false;
        for (int i = 1; i <= 10; i++) {
            int input = sc.nextInt();
            if (input > random_num)
                System.out.println("It is less than " + input);
            else if (input < random_num)
                System.out.println("It is more than " + input);
            else {
                isCorrect = true;
                break;
            }
        }

        if (isCorrect)
            System.out.println("Congragulation you have guessd the correct number i.e " + random_num);
        else
            System.out.println("Game over it was " + random_num);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我在这里得到的错误是输出:

import java.util.Scanner;

public class Program {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int random_num = (int) (Math.random() * 100) + 1;

        System.out.println("guess a number between 1 and 100");

        boolean isCorrect = false;
        for (int i = 1; i <= 10; i++) {
            int input = sc.nextInt();
            if (input > random_num)
                System.out.println("It is less than " + input);
            else if (input < random_num)
                System.out.println("It is more than " + input);
            else {
                isCorrect = true;
                break;
            }
        }

        if (isCorrect)
            System.out.println("Congragulation you have guessd the correct number i.e " + random_num);
        else
            System.out.println("Game over it was " + random_num);
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

您正在循环Scanner,但不检查是否有任何输入要获取。

以下是 Java 文档的摘录:

公共 int nextInt()

将输入的下一个标记扫描为 int。

调用 nextInt() 形式的此方法的行为与调用 nextInt(radix) 的行为完全相同,其中 radix 是此扫描器的默认基数。

返回:

从输入中扫描的 int

投掷:

InputMismatchException - 如果下一个标记与 Integer 正则表达式不匹配,
或者超出范围
NoSuchElementException - 如果输入已用尽
IllegalStateException - 如果此扫描器已关闭

发现您的错误消息;)


您的代码对于标准 Java 环境有效。
但是,由于您在 SoloLearn Java 容器中运行代码,因此您会遇到通常不应发生的错误情况。这是另一个线程已经关闭了输入流

正如 Ivar 已经提到的,您只需将代码更改为此即可使其在 SoloLearn 上运行而不会出现错误:

for (int i = 1; i <= 10 && sc.hasNextInt(); i++) {
    // Your logic
}
Run Code Online (Sandbox Code Playgroud)

但由于 SoloLearn 的实现需要您一次提供所有输入(不同的输入由换行符分隔),因此您将无法使用不同的猜测正确运行它。

SoloLearn 将获取这些输入(以换行符分隔),并一次读取不同的行。
然后一次将一个输入返回到您的程序。
一旦没有更多输入,它将关闭流。
但是,您的程序仍然尝试读取此流,然后收到 java.util.NoSuchElementException 错误。

以下是我认为在 SoloLearn 幕后发生的错误的可重现代码:

import java.io.ByteArrayInputStream;
import java.util.Scanner;

public class Program {

    private String[] userInput;
    private int inputNumber;
    
    public Program(String input) {
        this.userInput = input.split(" ");
        this.inputNumber = 0;
    }
    
    public void startGame() {
        int random_num = (int)(Math.random()*100)+1;
        
        System.out.println("Guess the number between 1 and 100!");
        
        boolean isCorrect = false;
        
        for (int i = 1; i <= 10; i++) {
            System.out.print("Guess "+ i +": ");
            int input = getInput();
            if (input > random_num)
                System.out.println("It is less than " + input);
            else if (input < random_num)
                System.out.println("It is more than " + input);
            else {
                isCorrect = true;
                break;
            }
        }
        
        if(isCorrect)
            System.out.println("Congratulations, you have guessed the correct number i.e " + random_num);
        else
            System.out.println("Game over! The number was " + random_num);
    }
    
    private int getInput() {
        if (inputNumber < userInput.length)
            fakeUserInput();
        
        Scanner sc = new Scanner(System.in);
        int input = -1;
        input = sc.nextInt();
        
        if (inputNumber == userInput.length)
            sc.close();
        
        return input;
    }
    
    private void fakeUserInput() {
        System.setIn(new ByteArrayInputStream(userInput[inputNumber].getBytes()));
        inputNumber++;
    }
    
    public static void main(String[] args) {
        Program p = new Program("10 20 30");
        p.startGame();
    }
}
Run Code Online (Sandbox Code Playgroud)

我们给它提供 3 个猜测:102030

这是输出:

猜猜1到100之间的数字!
猜测 1:超过 10
猜测 2:超过 20
猜测 3:超过 30
猜测 4:线程“main”中出现异常 java.util.NoSuchElementException
at java.util.Scanner. throwFor(Scanner.java :873)
在java.util.Scanner.next(Scanner.java:1496)
在java.util.Scanner.nextInt(Scanner.java:2128)
在java.util.Scanner.nextInt(Scanner.java:2087)
在程序.getInput(Program.java:47)
在 Program.startGame(Program.java:24)
在 Program.main(Program.java:62)

正如您所看到的,一旦输入耗尽并且流关闭,我们就会收到此错误。

我希望这可以解释您的问题并阐明原因