es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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");
    }
}
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la primera versión de try-with-resources es que el BufferedReader 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 el BufferedReader al final de cada iteración, evitando el bucle infinito.

    Para solucionar el problema en la versión de try-with-resources, el BufferedReader debe moverse fuera del bucle y cerrarse manualmente al final de cada iteración.

Comments are closed.