Java - Try-catch y do-while

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

Try-catch y do-while

Publicado por Nicolás Esteban (7 intervenciones) el 06/01/2020 01:54:10
Hola. Soy muy nuevo programando, por lo que quizás parezca una pregunta algo tonta.
Quiero saber como hacer para que cuando se ingresan datos por el Scanner y el carácter no es un número, se pidan los datos nuevamente. Estuve viendo algunos tutoriales en internet, pero sigo sin poder lograrlo. Este es el código:

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
30
import java.util.InputMismatchException;
import java.util.Scanner;
 
public class Inicio {
    Scanner entrada = new Scanner(System.in);
    private int tipoOperacion;
    boolean inputError = false;
 
    public void IngresoDatos() {
 
        do {
            try {
                inputError = false;
                System.out.println("Indique la operación que desea realizar");
                System.out.println("    1. Suma");
                System.out.println("    2. Resta");
                tipoOperacion = entrada.nextInt();
 
 
                if (tipoOperacion != 1 && tipoOperacion != 2) {
                    System.out.println("Ingrese un número válido");
                    inputError = true;
                }
            } catch (InputMismatchException e) {
                System.out.println("Debe ingresar un número");
                inputError = true;
            }
        } while (inputError == true);
    }
}
----------------------------------------------------------------------------------------------------------------------------------------------------

Cuando ingreso números que no son 1 o 2, anda perfecto, aparece el mensaje de "Ingrese un número válido" y vuelve a pedir los datos. El problema es cuando ingreso un carácter que no es un número, en este caso, se queda haciendo un bucle infinito de esta manera:

Indique la operación que desea realizar
1. Suma
2. Resta
Debe ingresar un número
Indique la operación que desea realizar
1. Suma
2. Resta
Debe ingresar un número
Indique la operación que desea realizar
1. Suma
2. Resta
Debe ingresar un número
-------------------------------------------------------------------------------------------------------------------------------------------------------

Espero que puedan ayudarme. Desde ya muchas gracias.
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
sin imagen de perfil
Val: 129
Ha disminuido 1 puesto en Java (en relación al último mes)
Gráfica de Java

Try-catch y do-while

Publicado por Lucho Gonzalez (53 intervenciones) el 06/01/2020 12:01:41
Buen Dia amigo; puede cambiar tu condicional a este
1
2
3
4
5
6
7
8
9
10
11
12
if  (tipoOperacion >= 0  &&  tipoOperacion < 0) {
        continue; // sentencia usada para continuar con el algoritmo;
        inputError = false;
else{
        System.out.println("Ingrese un número válido");
        inputError = true;
} catch (InputMismatchException e) {
        System.out.println("Debe ingresar un número");
}
} while (inputError == true);
}
}
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
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

Try-catch y do-while

Publicado por Kabuto (1381 intervenciones) el 06/01/2020 14:00:32
Hola.
La clase Scanner es un poco puñetera a la hora de hacer algo tan simple como leer valores numéricos.
No quiero extenderme ahora con explicaciones, solo te diré que para ahorrarte estos problemas lo mejor es leer datos siempre usando el método nextLine(), el que usamos para leer cadenas de texto.

Y cuando queramos valores numéricos, por ejemplo un int como pides en tu programa, entonces lo parseamos a int y ya podemos operar aritméticamente con él.

Tan solo habrá que controlar que el parseo no falle porque el usuario ha introducido letras y no números. En realidad es similar a lo que ya estás haciendo en tu programa, pero esta vez usaremos nextLine() para leer y controlaremos la excepción con otra clase distinta.

Te señalo en negrita los poquitos cambios que hay que hacer en tu código original:

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
30
31
32
33
import java.util.Scanner;
 
public class Inicio {
 
	Scanner entrada = new Scanner(System.in);
	private int tipoOperacion;
	boolean inputError = false;
 
	public void IngresoDatos() {
 
		do {
			try {
				inputError = false;
				System.out.println("Indique la operación que desea realizar");
				System.out.println(" 1. Suma");
				System.out.println(" 2. Resta");
				tipoOperacion = Integer.parseInt(entrada.nextLine()); //Leemos cadena texto y parseamos a valor entero
 
 
				if (tipoOperacion != 1 && tipoOperacion != 2) {
					System.out.println("Ingrese un número válido");
					inputError = true;
				}
				else
					System.out.println("Ha escogido la opcion nº" + tipoOperacion); //Este mensaje nos muestra cuando se ha elegido bien
			} catch (NumberFormatException e) { //Controlamos posible excepción por error en el parseo
				System.out.println("Debe ingresar un número");
				inputError = true;
			}
		} while (inputError == true);
	}
 
}


Si lo pruebo, en pantalla tengo este resultado donde podemos ver que no se bloquea si elegimos mal, siempre vuelve a pedir el dato hasta que tecleamos algo correcto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Indique la operación que desea realizar
 1. Suma
 2. Resta
3
Ingrese un número válido
Indique la operación que desea realizar
 1. Suma
 2. Resta
g
Debe ingresar un número
Indique la operación que desea realizar
 1. Suma
 2. Resta
d
Debe ingresar un número
Indique la operación que desea realizar
 1. Suma
 2. Resta
2
Ha escogido la opcion nº2


Como digo, lo ideal es que apliques como regla general lo de leer siempre usando nextLine() y luego parseas al tipo de datos que necesites realmente. Te ahorrarás varios problemas.
Otros lenguajes similares como C# es habitual también hacer así la lectura de datos por teclado.

nextInt(), nextDouble()... utilízalos solo en programas donde sabes que ÚNICAMENTE se van a recibir datos numéricos, o bien, en casos donde te da igual controlar o no estas posibles excepciones.

Un saludo.
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
Imágen de perfil de Billy Joel
Val: 2.665
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Try-catch y do-while

Publicado por Billy Joel (876 intervenciones) el 06/01/2020 14:28:24
Prueba con esto a ver...

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
30
31
32
33
34
35
36
37
38
39
40
41
public static void ingresoDatos() {
    Scanner entrada = new Scanner(System.in);
    String operacion;
    do {
        System.out.print("Indique la operación que desea realizar"
                + "\n1. Suma"
                + "\n2. Resta"
                + "\n3. Multiplicación"
                + "\n4. Resta: ");
        operacion = entrada.nextLine();
        int a, b;
        try {
            Integer.parseInt(operacion);
            System.out.print("Ingrese un numero válido: ");
            a = Integer.parseInt(entrada.nextLine());
            System.out.print("Ingrese un segundo numero válido: ");
            b = Integer.parseInt(entrada.nextLine());
            switch (operacion) {
                case "1":
                    System.out.println("La suma es: " + (a + b));
                    break;
                case "2":
                    System.out.println("La resta es: " + (a - b));
                    break;
                case "3":
                    System.out.println("La multiplicación es: " + (a * b));
                    break;
                case "4":
                    System.out.println("La división es: " + (a / b));
                    break;
                default:
                    operacion = "";
                    System.out.println("Opción incorrecta\n");
                    break;
            }
        } catch (NumberFormatException ex) {
            operacion = "";
            System.out.println("Debe ingresar un número");
        }
    } while (operacion.isEmpty());
}

Saludos,
Billy Joel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 21
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Try-catch y do-while

Publicado por Nicolás Esteban (7 intervenciones) el 06/01/2020 19:52:54
Parseando la entrada funcionó perfecto. De ahora en más lo voy a hacer de este modo. Muchisimas gracias por tomarse el tiempo de responder. Todos los días se aprende algo nuevo :).

Saludos y que tengan un buen día!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar