Java - Evitar error java.util.InputMismatchException con switch

 
Vista:
Imágen de perfil de jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Evitar error java.util.InputMismatchException con switch

Publicado por jose (73 intervenciones) el 01/12/2018 13:04:27
Hola a todos,

He construido un menú con 5 opciones del 1 al 5 en un Switch. al escribir letras me salta el error de java.util.InputMismatchException.

He intentado añadir un do{ }while{ pero se para en el while.

Alguien podria decirme como evitar el error y que vuelva a preguntarme por el menú.

Muchas gracias,

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
private void inici() {
    boolean sortir = false;
 
    int opcio = 0;
 
    while (!sortir) {
        System.out.println();
        System.out.println("1. Introduir el nom del fitxer");
        System.out.println("2. Mostrar dades per províncies");
        System.out.println("3. Mostrar la comarca amb el valor més alt i la comarca amb el valor més baix d’un any entre el 2012 i el 2016");
        System.out.println("4. Crear un fitxer amb la comarca amb el valor més alt i la comarca amb el valor més baix entre el 2012 i el 2016");
        System.out.println("5. Sortir");
 
        System.out.println("Escriu el número de l'opció:");
        opcio = scanner.nextInt();
 
        switch (opcio) {
        case 1:
            opcioEntrarNomFitxer();
            break;
        case 2:
            opcioMostrarDadesProvincies();
            break;
        case 3:
            opcioMostrarValorsMaxMinProvincies();
            break;
        case 4:
            opcioGravarValorsMaxMinMunicipis();
            break;
        case 5:
            /**
                * @see #fiPrograma().Finaliza el programa
                */
            fiPrograma();
            sortir = true;
            break;
        default:
            System.out.println("Només números entre 1 i 5");
        }
    }
}
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 jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Evitar error java.util.InputMismatchException con switch

Publicado por jose (73 intervenciones) el 01/12/2018 20:24:03
Hola Tom,

Se cual es el motivo del error. Lo que estoy buscando es una solución para que vuelva a preguntar. Lo he intentado de varias formas. Y no hay forma de que funcione.

Gracias por la respuesta,
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

Evitar error java.util.InputMismatchException con switch

Publicado por David (2 intervenciones) el 01/12/2018 22:10:44
Buenas Jose, me gustaría si se pudiese saber en que sitio poner las letras, por que aparentemente el programa que estás imprimiendo esta bien, por otro lado si puede ser, ayudaría mucho que imprimieses todo el error por que asi sabes si es un problema en otro módulo.

Para acabar ese error está vinculado a una recepción de datos desde teclado que no está bien implementada, como te digo ayudaría saber en que parte esta el error.


Un saludo y espero que ayude
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 jose
Val: 64
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Evitar error java.util.InputMismatchException con switch

Publicado por jose (73 intervenciones) el 01/12/2018 22:38:25
Hola David,

El método que tengo hecho es este:

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
public int menuAño(int colAño) {
    /**
     * @see #menuAño(int), método utilizado por los métodos
     * mostrarValorsMaxMinProvincies(String) y gravarValorsMaxMinMunicipis(String)
     * para preguntar por el año que se desea buscar entre 2012 y 2016
     * 
     * @param año, guarda el año por escrito por teclao
     * @param colAño integer que devuelve a los métodos el número de la columna a buscar en sus
     * respectivos arrays.
     * 
     * @return colAño, el número de la columna correspondiente al año.
     */
    Scanner scanner = new Scanner(System.in);
    System.out.print("Indica el año a recopilar (2012-2016):");
    String año = scanner.nextLine();
 
    switch (año) {
    case "2012":
        colAño=6;
        break;
    case "2013":
        colAño=5;
        break;
    case "2014":
        colAño=4;
        break;
    case "2015":
        colAño=3;
        break;
    case "2016":
        colAño=2;
        break;
    default:
        System.out.println("Ha de elegir un año entre 2012 al 2016");
        break;
    }
    //Devuelve el número de columna al método que lo solicita.
    return colAño;
}

Hay dos métodos que llama este a través de una llamada
1
2
int colAño = 0;
colAño=menuAño(colAño);

al preguntar por el año, habría que escribir sólo del 2012 al 2016, si escribimos otro año en vez de volver a preguntar crea un archivo.
Dicho archivo tiene la nomenclatura de "indicator"+colAño+".csv"

1
2
3
Indica el año a recopilar (2012-2016):2017
Ha de elegir un año entre 2012 al 2016
El archivo indicatorMunicipiC�digo comarca.csv se ha guardado correctamente

Espero que esto te ayuda,
Muchas gracias.
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

Evitar error java.util.InputMismatchException con switch

Publicado por david (2 intervenciones) el 01/12/2018 22:47:03
Y cuando te muestra el error que te imprime?? aunque sea feo pega todo el texto rojo

También te recomendaria encarecidamente que olvidases ñ y palabras con acentos en variables, nombres de funciones.... es decir lo limites solo a texto impreso en pantalla y aun así con cuidado....
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 Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Evitar error java.util.InputMismatchException con switch

Publicado por Kabuto (1381 intervenciones) el 01/12/2018 22:49:23
Hola, la clase Scanner es algo puñetera cuando en un programa queremos pedir datos numéricos y String.

Para evitar gran parte de los problemas, lo ideal es utilizar siempre el método nextLine() para pedir dato, y si queremos un dato numérico, parsearlo al tipo que necesitemos. Ejemplos:

1
2
3
String quieroUnString = scanner.nextLine();
int quieroUnEntero = Integer.parseInt(scanner.nextLine());
double quieroUnDouble = Double.parseDouble(scanner.nextLine());

Luego además, declarar varios objetos Scanner en distintos métodos, también puede tener efectos indeseados.

Lo ideal es declarar solo uno, como atributo de la clase, y de este modo TODOS los métodos tendrán acceso a él.

Ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MiClase {
 
    Scanner MiScanner = new Scanner(System.in);
 
    public MiClase() {
    }
 
    public void pedirDatos() {
    }
 
    public int pedirEnteros() {
    }
 
}

Todos esos métodos, así como el constructor de la clase, tienen acceso al objeto Scanner ya que al estar declarado como atributo de clase, tiene alcance total dentro de esta.
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

Evitar error java.util.InputMismatchException con switch

Publicado por Tom (1831 intervenciones) el 02/12/2018 10:07:21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestScanner {
	/* */
	public static void main(String args[]) {
		Scanner sc = new Scanner(System.in);
		while(true) {
			System.out.print("Input an integer: ");
			if(sc.hasNextInt()) {
				// OK
				System.out.println(sc.nextInt());
				break;
			} else {
				// Repeat
				sc.next();
			}
		}
	}
}
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