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 个猜测:10、20和30
这是输出:
猜猜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)
正如您所看到的,一旦输入耗尽并且流关闭,我们就会收到此错误。
我希望这可以解释您的问题并阐明原因。
| 归档时间: |
|
| 查看次数: |
49901 次 |
| 最近记录: |