Bucle de validación de entrada de usuario con declaraciones try-with-resources que se repite infinitamente después de una entrada de usuario incorrecta.
Estoy tratando de crear un bucle de validación de entrada de usuario y me gustaría usar un try-with-resources para el bufferedReader. Sin embargo, cuando inserto una entrada incorrecta, comienza a hacer un bucle infinito imprimiendo el primer mensaje y el mensaje de error capturado.
Sin embargo, cuando cambio el try-with-resources a un bloque try-catch estándar, todo funciona como se espera.
Supongo que el problema está con el bloque try-with-resources pero realmente no entiendo por qué. ¿Alguien puede explicar, por favor?
Versión con try-with-resources
int nrOfVersions;
int firstBadVersion;
while (true) {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)))
{
System.out.println("¿Cuántas versiones hay?");
nrOfVersions = Integer.parseInt(bufferedReader.readLine());
System.out.println("¿Cuál es la primera versión incorrecta?");
firstBadVersion = Integer.parseInt(bufferedReader.readLine());
break;
} catch (IOException | NumberFormatException e)
{
System.out.println("Vuelve a intentarlo");
}
}
Bloque try-catch estándar
int nrOfVersions;
int firstBadVersion;
while (true) {
try
{
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
System.out.println("¿Cuántas versiones hay?");
nrOfVersions = Integer.parseInt(bufferedReader.readLine());
System.out.println("¿Cuál es la primera versión incorrecta?");
firstBadVersion = Integer.parseInt(bufferedReader.readLine());
bufferedReader.close();
break;
} catch (IOException | NumberFormatException e)
{
System.out.println("Vuelve a intentarlo");
}
}
davy.ai
El problema con la primera versión de
try-with-resources
es que elBufferedReader
se cierra automáticamente cuando termina el bloque try, pero como está dentro de un bucle, se crea y se cierra repetidamente. Esto hace que el flujo de entrada nunca se cierre, lo que lleva a un bucle infinito de impresión del primer mensaje y el mensaje de error capturado.Por otro lado, el segundo bloque estándar de
try-catch
cierra manualmente elBufferedReader
al final de cada iteración, evitando el bucle infinito.Para solucionar el problema en la versión de
try-with-resources
, elBufferedReader
debe moverse fuera del bucle y cerrarse manualmente al final de cada iteración.