【发布时间】:2012-11-14 07:50:07
【问题描述】:
我这里有两个代码块。一个扫描仪正确地等待用户输入,而另一个扫描仪直接吹过它并调用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() 调用startGame(),后者又调用某个Player 类的findBestMove() 方法......这是非工作代码所在的位置。程序中是否存在不适合接受输入的情况?我的印象是,只要我想要用户输入,我就可以使用这种方法。谢谢!
【问题讨论】:
-
我在
findBestMove中看到您执行scan.close()也会关闭源流 - 您是否在startGame()中执行相同操作,在您的etc之后某处? -
此问题中讨论的类似问题,不确定是否应作为重复关闭:stackoverflow.com/questions/7056749/…
-
@Dennis 我在发帖之前查看过,我认为我的问题不相关但可能是错误的。
-
@Houdini 那么,这可能是 Denis 提到的问题之外的第二个问题。不要这样做——
InputStream实现了Closeable接口,在这种情况下Scanner.close()也将关闭System.in。 docs.oracle.com/javase/7/docs/api/java/util/Scanner.html -
你在任何地方都有一个全局
try...catch块吗?因为关闭扫描仪并打开新的扫描仪会在下次读取时给我一个NoSuchElementException,因为标准输入已关闭。
标签: java user-input java.util.scanner