Usando try-with-resources con System.in [duplicado]
Entonces, mi IDE se queja si no incluyo el Escáner en un intento con el bloque, pero si lo hago de esta manera en lugar de cerrarlo cuando se supone que debe cerrarse (una vez que se gana = verdadero), cierra el flujo System.in, ¿Cómo evito eso?
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);
}
Respuestas
Recomendaría no tener varios Scanner
objetos envueltos alrededor del mismo flujo de entrada. (en este caso, System.in
) El motivo de esto es que los escáneres pueden consumir y almacenar en búfer datos de la secuencia subyacente. Esto significa que en algunos casos se pueden perder datos. Puede leer más sobre esto en esta pregunta .
Es posible que pueda salirse con la suya aquí, en cuyo caso simplemente no debería cerrar el objeto Scanner al no envolverlo en un try-with-resources. En ese caso, puede suprimir la advertencia con @SuppressWarnings("resource")
. Sin embargo, esta es una mala práctica.
En su lugar, recomendaría crear un único Scanner
objeto global que se envuelva System.in
y luego pasarlo a este método como parámetro en lugar de crear un nuevo escáner en cada método que requiera entrada.
¿Cómo evito eso?
No cierre el Scanner
objeto, es decir, no utilice try-with-resources en un Scanner
envoltorio System.in
.
En su lugar, acepte la advertencia y ocúltela, ya que es una excepción especial a las reglas normales de "recursos":
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
FYI: Estoy usando Eclipse IDE, y "Surround with try-with-resources" es solo la primera opción para corregir la advertencia:
