Verwenden von Try-with-Resources mit System.in [Duplikat]
Meine IDE beschwert sich also, wenn ich den Scanner nicht in einen Versuch mit Block einschließe, aber wenn ich es auf diese Weise mache, anstatt ihn zu schließen, wenn er geschlossen werden soll (sobald win = true), schließt er den System.in-Stream. Wie verhindere ich das?
public final void turn() {
System.out.println("Enter your next move!");
try (Scanner keyboard = new Scanner(System.in)) {
final String move = keyboard.nextLine();
if (move.isEmpty()) {
won = true;
return;
}
if (!validateFormat(move)) {
System.out.println("Invalid format, try again.");
return;
}
String[] moveAr;
try {
moveAr = move.split(",");
} catch (PatternSyntaxException e) {
System.out.println(e.getMessage());
return;
}
try {
validFields(moveAr);
} catch (InvalidTurnException e) {
System.out.println(e.getMessage());
return;
}
final char colour = spielFeld.getField(getColumn(moveAr[0].charAt(0)),Character.getNumericValue(moveAr[0].charAt(1)) - 1).getColour();
for (final String string : moveAr) {
final int line = Character.getNumericValue(string.charAt(1)) - 1;
final int column = getColumn(string.charAt(0));
spielFeld.cross(column,line);
final int columni = getColumn(string.charAt(0));
if (spielFeld.columnCrossed(columni)) {
points += crossedValues(string.charAt(0));
}
}
if (spielFeld.colourComplete(colour)) {
points += COLOUR_POINTS;
coloursCrossed++;
}
if (coloursCrossed >= 2) {
won = true;
}
}
System.out.println("Momentane Punkte: " + points);
}
Antworten
Ich würde empfehlen, nicht mehrere Scanner
Objekte um denselben Eingabestream zu legen. (in diesem Fall System.in
) Der Grund dafür ist, dass Scanner möglicherweise Daten aus dem zugrunde liegenden Stream verbrauchen und puffern. Dies bedeutet, dass in einigen Fällen Daten verloren gehen können. Sie können mehr darüber in dieser Frage lesen .
Möglicherweise können Sie hier damit durchkommen. In diesem Fall sollten Sie das Scannerobjekt einfach nicht schließen, indem Sie es nicht in einen Versuch mit Ressourcen einschließen. In diesem Fall können Sie die Warnung mit unterdrücken @SuppressWarnings("resource")
. Dies ist jedoch eine schlechte Praxis.
Stattdessen würde ich empfehlen, ein einzelnes globales Scanner
Objekt zu erstellen , das sich umgibt System.in
, und es dann als Parameter an diese Methode zu übergeben, anstatt in jeder Methode, die Eingaben erfordert, einen neuen Scanner zu erstellen.
Wie verhindere ich das?
Schließen Sie das Scanner
Objekt nicht, dh verwenden Sie Try-with-Resources nicht für ein Scanner
Wrapping System.in
.
Akzeptieren Sie stattdessen die Warnung und verbergen Sie sie, da dies eine besondere Ausnahme von den normalen "Ressourcen" -Regeln darstellt:
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
Zu Ihrer Information: Ich verwende die Eclipse-IDE und "Umgeben mit Versuchen mit Ressourcen" ist nur die erste Option zum Beheben der Warnung:
