我这里有两个代码块。一个扫描器正确地等待用户输入,另一个则直接通过它并调用NextInt()
,返回NosuchelementException
。下面是工作的块:
public void startGame() {
out.println("Player1: 1 for dumb player, 2 for smart player, 3 for human player.");
Scanner scan = new Scanner(System.in);
p = scan.nextInt();
if (p == 1)
p1 = new DumbPlayer("ONE");
if (p == 2)
p1 = new SmartPlayer("ONE");
else
p1 = new HumanPlayer("ONE");
out.println("Player2: 1 for dumb player, 2 for smart player, 3 for human player.");
p = scan.nextInt();
if (p == 1)
p2 = new DumbPlayer("TWO");
if (p == 2)
p2 = new SmartPlayer("TWO");
else
p2 = new HumanPlayer("TWO");
scan.close();
下面是没有的块:
public int findBestMove(Set<Integer> moves, Board b) {
Set<Integer> set = new HashSet<Integer>();
out.println("Player " +name+ ", select a column from 1-7: ");
Scanner scan = new Scanner(System.in); <--here it should wait for input, but does not!
int move = scan.nextInt(); <-- NoSuchElementException
scan.close();
for (int x = 1; x <= 7; x++) {
set.add(move);
move += 7;
}
....etc
这两个都是单独的类,并且是从另一个类中的main方法调用的。基本上,main()
调用startgame()
,后者又调用某个Player类的findBestMove()
方法...这是非工作代码所在的地方。程序中是否有不适合接受输入的时候?我的印象是,任何时候我需要用户输入,我都可以使用这种方法。谢谢!
根据java.util.Scanner javadoc,scanner.close()
关闭关联的流,如果该流实现了closeable
接口。java.lang.System.In
是一个InputStream,它实现了Closeable
接口。因此,在与System.In
关联的扫描器
上调用Scanner.Close()
后,System.In
流将关闭且不再可用。
下面的SSCE对我有效。我从问题中删除了一些与实际问题无关的代码。注意,使用这种方法,当它工作时,Eclipse会给我警告“resource leak:'scan'is never close”
,因此更好的解决方案是只使用一个扫描器实例。
package com.example;
import java.util.Scanner;
import java.util.Set;
import static java.lang.System.out;
public class ScannerTest {
int p = 0;
String name = "Test";
public void startGame() {
out.println("Player1: 1 for dumb player, 2 for smart player, 3 for human player.");
Scanner scan = new Scanner(System.in);
p = scan.nextInt();
out.println("Result1: " + p);
out.println("Player2: 1 for dumb player, 2 for smart player, 3 for human player.");
p = scan.nextInt();
out.println("Result2: " + p);
// scan.close(); // Do not close the Scanner to leave System.in open
}
public int findBestMove(Set<Integer> moves, Object /*Board*/ b) {
out.println("Player " +name+ ", select a column from 1-7: ");
Scanner scan = new Scanner(System.in);
int move = scan.nextInt();
// scan.close(); // Do not close the Scanner to leave System.in open
out.println("Move: " + move);
return 0;
}
public void run() {
startGame();
findBestMove(null, null);
}
public static void main(String[] args) {
ScannerTest st = new ScannerTest();
st.run();
}
}
问题内容: 我正在使用Java的扫描仪读取用户输入。如果我仅使用nextLine一次,那就可以了。使用两个nextLine时,第一个不会等待用户输入字符串(第二个会输入)。 输出: X:Y :(等待输入) 我的密码 任何想法为什么会发生这种情况?谢谢 问题答案: 您可能像以前那样调用方法。这样的程序是这样的: 演示您所看到的行为。 问题是不消耗,因此下一个调用将消耗它,然后等待读取的输入。 您需要
我制作了一个程序来获取用户输入并将其传递出去,但出于某种原因,scanner类和下一行甚至不等待用户获取输入,而是跳过了整个获取输入部分。下面是我的代码: 基本上,程序就结束了,我没有输入任何输入,我找不到一个解决方案或解释这一点。
我正在使用Java的扫描仪读取用户输入。如果我只使用nextLine一次,它可以正常工作。对于两个nextLine,第一个不等待用户输入字符串(第二个)。 输出: X:Y:(等待输入) 我的代码 你知道为什么会发生这种事吗?谢谢
为此,我创建了一个名为的单例。这个类处理所有的输入阅读内容。我创建了一个名为的方法,它将回调作为参数。在这个方法中,我创建了一个新线程,并在其中等待使用的输入。这个类还有方法,它向上面描述的线程发送中断消息。下面是该类的当前实现: 这个代码极不可靠。我一会儿就告诉你我的意思。我制作了一个名为Client的玩具类,在中,我用计时器模拟了消息收入。 以下是它的工作原理: 我知道这个问题非常长(也许是不
我怎样才能解决这个问题?