Java Scanner wartet nicht auf eine Eingabe

Habe ich zwei code-Blöcke hier. Ein scanner ordnungsgemäß wartet, Benutzer-Eingabe, und die andere nur Schläge durch es hindurch und ruft nextInt() das gibt einen NoSuchElementException. Hier ist der block, der funktioniert:

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

Und hier ist der block, der nicht:

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

Beide sind separate Klassen, und sind aufgerufen, aus einer main-Methode in eine Klasse. Im Grunde main() Anrufe startGame(), die wiederum ruft die findBestMove() Methode, einige Spieler Klasse...das ist, wo der nicht funktionierende code befindet. Gibt es Zeiten im Programm, wo es nicht angebracht ist, zu nehmen-Eingang? Ich hatte den Eindruck, dass ich immer wenn ich wollte eine Benutzereingabe, die ich verwenden könnte, dieser Ansatz. Danke!

Ich sehe in findBestMove, dass Sie eine scan.close() die auch in der Nähe der source-stream - tun Sie das gleiche in startGame() irgendwo nach Ihrem etc?
ähnliches Problem diskutiert in dieser Frage, nicht sicher, ob es geschlossen werden sollten, als dupicate: stackoverflow.com/questions/7056749/...
Ich sah, dass vor der Veröffentlichung glaube ich nicht, dass mein Problem bezieht sich aber falsch sein könnte.
dann könnte dies das zweite Problem neben dem Denis erwähnt. Dont do it - InputStream implementiert die Closeable - Schnittstelle, in dem Fall Scanner.close() wird auch in der Nähe System.in. docs.oracle.com/javase/7/docs/api/java/util/Scanner.html
Sie haben eine Globale try...catch block irgendwo? da schließen einen scanner und eine neue zu öffnen gibt mir eine NoSuchElementException auf weiter zu Lesen, weil stdin geschlossen ist.

InformationsquelleAutor Houdini | 2012-11-14

Schreibe einen Kommentar