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!
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.htmlSie 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Entsprechend der java.util.Scanner javadoc,
Scanner.close()
schließt die damit verbundenen Strom, wenn dieser Strom setzt dieCloseable
- Schnittstelle.java.lang.System.in
ist ein InputStream, die implementiert dieCloseable
- Schnittstelle. Also, nach dem AufrufScanner.close()
auf eineScanner
die im Zusammenhang mitSystem.in
, dieSystem.in
stream ist geschlossen und nicht mehr verfügbar.Den folgenden SSCCE für mich funktioniert. Ich habe entfernt code aus der Frage ist nicht relevant für das eigentliche Problem. Beachten Sie, dass mit diesem Ansatz, während es funktioniert, Eclipse gibt mir die Warnung
"Resource leak: 'scan' is never closed"
, so dass eine bessere Lösung wäre die Verwendung einer Scanner-Instanz nur.close()
die eine aus der Klasse, die war schon arbeiten! Das ist so seltsam für mich, ich dont öffnen Sie die input-stream wieder nach oben, wenn ich verkünde, daß der neue Scanner? Naja...jetzt funktioniert, danke!Sie kennen das wahrscheinlich, aber für andere vielleicht liest Sie tun können, eine
import static java.lang.System.*
und dies ermöglicht die Verwendung von nurout.println()
auch.Danke 🙂 ich habe aktualisiert die sample-code. In jedem Fall, bei der Verwendung von statischen imports, stellen Sie sicher, überprüfen Sie die Statische Import docs. Ich bin generell der Vermeidung von wildcard-imports. Und ich bin nicht sicher, ob ich lieber statisch importieren
System.out
mehr explizit erwähnenswertSystem.out
, vor allem, weiljava.lang.*
implizit importiert sowieso. Siehe auch stackoverflow.com/questions/2504078/..., insbesondere die Antwort vonStephen C
.InformationsquelleAutor Andreas Fester
nextInt()
nicht verwerfen\n
im stream, so dass der nächste Aufruf findet nichts. Sie haben, um es zu überspringen manuell mitScanner.skip("\n")
oderScanner.nextLine()
BEARBEITEN Nach, herauszufinden, dass "skipping
readInt()
" bedeutet, dass der code hat eine Ausnahme ausgelöst. und mit @Andreas Hilfe, hier ist eine alternative Lösung. In java6 wird eine neue Klasse Konsole wurde Hinzugefügt, für eine bessere Schnittstelle zu stdin. Und es gibt einen Reader, egal wie viel Sie es schließen. Also der folgende Code funktioniert Prima:nextInt()
Warum muss ich es tun, im zweiten Fall und die erste nicht?
Ich habe es ausprobiert, aber entweder sagt keine Zeile gefunden wird, oder im Fall von
"\n"
es sagtat java.util.Scanner.skip(Unknown Source)
.siehe mein edit über eine alternative Lösung für Ihr problem.
Aus irgendeinem Grund
System.console()
ist die Rückgabe null, so wenn ich versuche zu nennenconsole.reader()
es gibt mir einNullPointerException
.InformationsquelleAutor Denis Tulskiy
Versuchen Sie es mit
scan.reset();
stattscan.close()
.scan.close()
löst NoSuchElementException wie Denis Tulskiy sagte.scan.close()
.Ja, natürlich. Ich hätte hinzufügen von details. Sagen-scan.close () - ich meine, mit diesem. Eigentlich ist es diesen Fehler auslösen, wenn es Scannen für den nächsten posten gefunden, der scanner ist geschlossen. Das ist, was ich gefunden durch Debuggen.
Selbst wenn ich den scanner öffnen, bekomme ich das gleiche Ergebnis.
InformationsquelleAutor chAmi
Verbrachte ich nur etwa 15 Minuten Fehlersuche dieses Problem und mein problem war anders als alle der oben genannten.
Dem code ist gut, aber ich bin mit Sublime Text und es läuft in der terminal-emulator innerhalb sublime text, auf windows. Dies verhindert der scanner tatsächlich erlauben Sie mir, zu versuchen, um die Eingabe etwas.
Lief ich die app mit cmd und es funktionierte gut. Ich hoffe, das jemand hilft.
InformationsquelleAutor SgtPooki