Java - Genera un bucle infinito

 
Vista:
sin imagen de perfil
Val: 72
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Genera un bucle infinito

Publicado por smn (25 intervenciones) el 08/09/2020 04:56:50
Muy buenas gente, tengo un problema con este codigo lo que pasa es que me genera un bucle infinito si ingreso una letra y lo que yo espero que haga es que me vuelva a solicitar el numero.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JAVAE {
    public static void main(String[] args) {
        Scanner teclado = new Scanner(System.in);
        int opcion = 0;
 
        while(true){
            System.out.println("Seleccione una opcion\n1 - Agregar\n2 - Mostrar\n3 - Eliminar\n4 - Salir\n--------------------------------------");
 
            try{
                opcion = teclado.nextInt();
 
                if(opcion == 1){
                    System.out.println("Elegiste agregar\n-----------------------------");
                }else if(opcion == 2){
                    System.out.println("Elegiste mostrar\n-----------------------------");
                }else if(opcion == 3){
                    System.out.println("Elegiste elimiar\n-----------------------------");
                }else if(opcion == 4){
                    System.out.println("Nos Vemos.");
                    break;
                }
            }catch(Exception e){
                System.out.println("Ingrese una opcion correcta" + e);
                continue;
            }
        }
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Genera un bucle infinito

Publicado por Kabuto (1381 intervenciones) el 08/09/2020 14:51:33
Hola,
al ingresar una letra, nextInt(), que solo sabe de números enteros, no sabe que hacer con la letra, así que lanza una excepción.

Pero eso no implica que la letra desaparezca, esa letra sigue en el flujo de datos del Scanner, a la espera de que "alguien" que sí sepa qué hacer con ella, se haga cargo.

Por eso entras en bucle infinito, porque al repetirse el while e invocar de nuevo a nextInt(), vuelve a encontrarse con la letra anterior, y vuelve a lanzar excepción, y así hasta el infinito.

Lo puedes solucionar, incluyendo en el catch una llamada a un método que sí sepa qué hacer con la letra, por ejemplo nextLine(), quién cogerá todos los caracteres que hayan podido quedarse en el flujo de datos y lo dejará limpio para el próximo ciclo del bucle.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class JAVAE {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
		int opcion = 0;
 
		while(true){
			System.out.println("Seleccione una opcion\n1 - Agregar\n2 - Mostrar\n3 - Eliminar\n4 - Salir\n--------------------------------------");
 
			try{
				opcion = teclado.nextInt();
 
				if(opcion == 1){
					System.out.println("Elegiste agregar\n-----------------------------");
				}else if(opcion == 2){
					System.out.println("Elegiste mostrar\n-----------------------------");
				}else if(opcion == 3){
					System.out.println("Elegiste elimiar\n-----------------------------");
				}else if(opcion == 4){
					System.out.println("Nos Vemos.");
					break;
				}
			}catch(Exception e){
				System.out.println("Ingrese una opcion correcta" + e);
				teclado.nextLine(); //Limpiamos flujo de datos del Scanner
			}
		}
 
	}
}

Por cierto, forzar un bucle a funcionar directamente con true y usar break para ponerle fin, aunque está bastante extendido y aún hay profesores que enseñan a hacerlo así, no es una forma recomendable, ni elegante, de estructurar un programa.
Es más, no es necesario en absoluto.

En tu programa, quieres repetir el bucle MIENTRAS NO SE INGRESE EL VALOR 4.
Pues ya está, esa debería ser la condición de tu bucle.
Ya no se necesita "romper" el programa con break. Poniendo una condición adecuada, el flujo del programa sigue su camino correcto, sin "romperlo"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class JAVAE {
	public static void main(String[] args) {
		Scanner teclado = new Scanner(System.in);
		int opcion = 0;
 
		while(opcion != 4){
			System.out.println("Seleccione una opcion\n1 - Agregar\n2 - Mostrar\n3 - Eliminar\n4 - Salir\n--------------------------------------");
 
			try{
				opcion = teclado.nextInt();
 
				if(opcion == 1){
					System.out.println("Elegiste agregar\n-----------------------------");
				}else if(opcion == 2){
					System.out.println("Elegiste mostrar\n-----------------------------");
				}else if(opcion == 3){
					System.out.println("Elegiste elimiar\n-----------------------------");
				}else if(opcion == 4){
					System.out.println("Nos Vemos.");
				}
			}catch(Exception e){
				System.out.println("Ingrese una opcion correcta" + e);
				teclado.nextLine();
			}
		}
 
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 72
Ha aumentado su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Genera un bucle infinito

Publicado por smn (25 intervenciones) el 09/09/2020 01:17:32
Muchas Gracias me sirvio.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar