Java Scanner 不等待输入



我这里有两个代码块。一个扫描仪正确等待用户输入,另一个扫描程序直接吹过它并调用返回NoSuchElementException nextInt()。这是有效的块:

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() 方法...这是非工作代码所在的位置。程序中是否有不适合接受输入的时间?我的印象是,每当我想要用户输入时,我都可以使用这种方法。谢谢!

nextInt()不会丢弃流中的n,因此下一次调用不会找到任何内容。您必须使用Scanner.skip("n")Scanner.nextLine()手动跳过它

编辑 在弄清楚"跳过readInt()"意味着代码抛出异常之后。在@Andreas的帮助下,这里有一个替代解决方案。在 java6 中,添加了一个新的类控制台,以便为 stdin提供更好的接口。它返回一个 Reader,它不在乎你关闭了多少。因此,以下代码片段工作正常:

    Scanner fi = new Scanner(System.console().reader());
    System.out.println(fi.nextInt());
    fi.close();
    fi = new Scanner(System.console().reader());
    System.out.println(fi.nextInt());
    fi.close();

根据java.util.Scanner javadoc,如果该流实现了Closeable接口,Scanner.close()关闭关联的流。 java.lang.System.in是一个 InputStream,它实现Closeable接口。因此,在与System.in关联的Scanner上调用Scanner.close()后,System.in流将关闭,不再可用。

以下SSCCE对我有用。我已经从问题中删除了一些与实际问题无关的代码。请注意,使用这种方法,虽然它有效,但 Eclipse 会给我警告"Resource leak: 'scan' is never closed",因此更好的解决方案是仅使用一个 Scanner 实例。

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

尝试使用 scan.reset(); 而不是 scan.close()scan.close()将抛出Denis Tulskiy所说的NoSuchElementException。

我只花了大约 15 分钟来解决此问题,我的问题与上述所有问题都不同。

代码很好,但我正在使用Sublime Text并在Windows上的sublime text内的终端模拟器中运行它。这阻止了扫描仪实际上允许我尝试输入某些内容。

我使用 cmd 运行该应用程序,它工作正常。我希望这对某人有所帮助。

相关内容

  • 没有找到相关文章