我制作了一个简单的程序,该程序生成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);
}
}
答案 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)
尝试一下并告诉我