线程“主”中的Java异常

时间:2019-03-15 09:51:41

标签: java java.util.scanner

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

<div>
  <input id="duration" type="number" value="3" />
  <button id="fetch">Fetch data from server</button>
</div>

但是我得到的错误是输出:

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);
    }
}

3 个答案:

答案 0 :(得分:1)

您正在遍历Scanner,但没有检查是否有任何要提取的输入。

这是Java文档的摘录:

  

public int nextInt()

     

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

     

对该方法的调用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
}

但是,由于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();
    }
}

我们提供3个猜测: 10 20 30

这是输出:

  

猜数字在1到100之间!
  猜测1:超过10个
  猜猜2:超过20
  猜想3:超过30个
  猜测4:线程“ main”中的异常java.util.NoSuchElementException
    在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)
    在Program.getInput(Program.java:47)
    在Program.startGame(Program.java:24)
    在Program.main(Program.java:62)

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

我希望这可以解释您的问题,并为为什么提供一些启发。

答案 1 :(得分:0)

这是答案,我尝试这样做,并且在 main sc.close() 中找到了。注释行后一切正常! :

<块引用>

@I_code 这是您使用的实际代码吗?这对我来说可以。 System.in 关闭时会抛出该错误。您是否在代码中未显示的地方使用了 sc.close()?

–@Ivar 2019 年 3 月 15 日 10:10

答案 2 :(得分:-1)

早上好,您需要像这样在外初始化输入变量:

int input;

for (int i = 1; i <= 10; i++) {
            input = sc.nextInt();
            if (input > random_num)

尝试一下并告诉我