Java - Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.t

 
Vista:
sin imagen de perfil

Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.t

Publicado por Emanuel Negrete (9 intervenciones) el 02/11/2022 02:42:07
tengo este error al ejecutar el codigo principal

"Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:943)
at java.base/java.util.Scanner.next(Scanner.java:1598)
at java.base/java.util.Scanner.nextDouble(Scanner.java:2569)
at Principal.main(Principal.java:52)"


este es el codigo(2)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
public class Persona
{
 //Atributos de la clase
private String Nombres;
private String Apellidos;
private String Direccion;
private int Edad;
private double Peso;
private double Estatura;
 
 //Constructor
public Persona()
{
    // inicio Variables
    this.Nombres="Emanuel";
    this.Apellidos="Negrete";
    this.Direccion="Amaury garcia";
    this.Edad=19;
    this.Peso=47;
    this.Estatura=1.58;
}
//Setter
public void setNombres(String Nombres)
 {
    this.Nombres=Nombres;
 }
 public void setApellidos(String Apellidos)
 {
    this.Apellidos=Apellidos;
 }
 public void setDireccion(String Direccion)
 {
    this.Direccion=Direccion;
 }
 public void setEdad(int E)
 {
    this.Edad=E;
 }
 public void setPeso(double Pe)
 {
    this.Peso=Pe;
 }
 public void setEstatura(double Esta )
 {
    this.Estatura=Esta;
 }
 
//Getter
public String GetNombres()
{
    return Nombres;
}
public String GetApellidos()
{
    return Apellidos;
}
public String GetDireccion()
{
    return Direccion;
}
public int GetEdad()
{
    return Edad;
}
public double GetPeso()
{
    return Peso;
}
public double GetEstatura()
{
    return Estatura;
}
 
public void Mostrar()
 {
    System.out.println("Peso "+Peso);
    System.out.println("Estatura "+Estatura);
 }
 
 public void validar()
  {
    double imc;
    imc=this.Peso/(this.Estatura*this.Estatura);
    //Edad
     if(Edad>=18)
        {
            System.out.println("USTED ES MAYOR DE EDAD");
        }
        else
        {
            System.out.println("USTED ES MENOR DE EDAD");
        }
    //Imc
    if(imc>=0 && imc <18)
       {
        System.out.println("SU MASA CORPORAL ES "+imc+ " SU PESO ES BAJO");
       }
       else if(imc>=18 && imc<25)
       {
        System.out.println("SU MASA CORPORAL ES "+imc+"SU PESO ES NORMAL");
       }
 
 
 
 
 
  }
 
 
 
}


este es el otro código Principal, van en la misma fuente
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import javax.swing.JOptionPane;
 
import java.util.Scanner;
 
public class Principal
{
 
public static void main(String[] args)
 {
    //Instancia
 Persona pers1=new Persona();
    pers1.setNombres(JOptionPane.showInputDialog("ESCRIBA SU NOMBRE"));
    pers1.setApellidos(JOptionPane.showInputDialog("ESCRIBA SU APELLIDO"));
    pers1.setDireccion(JOptionPane.showInputDialog("ESCRIBA SU DIREECION "));
    pers1.setEdad(Integer.parseInt(JOptionPane.showInputDialog("ESCRIBA SU EDAD ")));
    pers1.setPeso(Double.parseDouble(JOptionPane.showInputDialog ("ESCRIBE SU PESO")));
    pers1.setEstatura(Double.parseDouble(JOptionPane.showInputDialog ("ESCRIBE SU ESTATURA")));
 
    System.out.println("NOMBRE: "+pers1.GetNombres());
    System.out.println("APELLIDOS: "+pers1.GetApellidos());
    System.out.println("DIRECCION: "+pers1.GetDireccion());
    System.out.println("EDAD: "+pers1.GetEdad());
    /*System.out.println("PESO: "+pers1.GetPeso());
    System.out.println("ESTATURA: "+pers1.GetEstatura());*/
    pers1.Mostrar();
    pers1.validar();
 
Persona pers2=new Persona();
    Scanner sc=new Scanner(System.in);
 
    System.out.print("ESCRIBA SU NOMBRE: ");
    String Nom=sc.nextLine();
    pers2.setNombres(Nom);
 
    System.out.print("ESCRIBA SU APELLIDO: ");
    String Ape=sc.nextLine();
    pers2.setApellidos(Ape);
 
    System.out.print("ESCRIBA SU DIRECCION: ");
    String Dir=sc.nextLine();
    pers2.setDireccion(Dir);
 
    System.out.print("ESCRIBA SU EDAD: ");
    int Edad=sc.nextInt();
    pers2.setEdad(Edad);
 
    System.out.print("ESCRIBA SU PESO: ");
    double Pe=sc.nextDouble();
    pers2.setPeso(Pe);
 
    System.out.print("ESCRIBA SU ESTATURA: ");
    double Esta=sc.nextDouble();
    pers2.setEstatura(Esta);
 
    System.out.println("NOMBRE: "+pers2.GetNombres());
    System.out.println("APELLIDO:"+pers2.GetApellidos());
    System.out.println("DIRECCION: "+pers2.GetDireccion());
    System.out.println("EDAD: "+pers2.GetEdad());
    // System.out.println("PESO: "+pers2.GetPeso());
   // System.out.println("ESTATURA: "+pers2.GetEstatura());
 
 
    pers2.Mostrar();
    pers2.validar();
 
 
 
 }
 
}
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

Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.t

Publicado por Kabuto (1381 intervenciones) el 02/11/2022 12:25:32
Probablemente te ocurra cuando introduces la altura o el peso de "persona2".
Aunque también te puede ocurrir con "persona1"

El problema está en según si usas el "punto decimal" o la "coma decimal" al introducir un valor con decimales.

Al leer con JOptionPane, te va a aceptar el valor con "punto decimal" --> 1.87 pero no con "coma decimal" --> 1,87

En cambio, al leer con el Scanner ocurre lo contrario, te aceptará valores con "coma decimal" pero no con "punto decimal".
Y sin embargo, luego al imprimir en pantalla que lo hará con el "punto decimal"

Aunque este comportamiento a veces puede variar según el idioma/región configurada en nuestro sistema operativo. Puede que a ti te funcione de forma distinta que a mí.

Hay formas de solucionar esto. Algunas más profesionales aunque algo complejas

Otras más sencillas, pero funcionales, que para no complicarnos haciendo estos ejercicios de aprendizaje ya nos pueden servir.

Una forma sencilla para salir del paso, es leer todos los valores, tanto cadenas de texto como numéricos, usando el método nextLine().
Y si lo que queremos es un número, pues lo "parseamos" a lo que necesitemos.

De esta manera, estamos igualando el comportamiento de lectura por consola a las lecturas que hacemos con JOptionPane, porque ya no es el Scanner quien transforma el texto de teclado a valores numéricos.
Si no las clases Integer y Double, que son las mismas que usamos para parsear lo leído con JOptionPane.

De esta forma, se unifica el comportamiento y todos los valores se pueden introducir con "punto decimal".
También recomienda hacer lo mismo cuando queremos un valor int, aunque aquí no haya problemas de decimales.
Marco en negrita los cambios:
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
Persona pers2=new Persona();
		Scanner sc=new Scanner(System.in);
 
		System.out.print("ESCRIBA SU NOMBRE: ");
		String Nom=sc.nextLine();
		pers2.setNombres(Nom);
 
		System.out.print("ESCRIBA SU APELLIDO: ");
		String Ape=sc.nextLine();
		pers2.setApellidos(Ape);
 
		System.out.print("ESCRIBA SU DIRECCION: ");
		String Dir=sc.nextLine();
		pers2.setDireccion(Dir);
 
		System.out.print("ESCRIBA SU EDAD: ");
		int Edad=Integer.parseInt(sc.nextLine());
		pers2.setEdad(Edad);
 
		System.out.print("ESCRIBA SU PESO: ");
		double Pe=Double.parseDouble(sc.nextLine());
		pers2.setPeso(Pe);
 
		System.out.print("ESCRIBA SU ESTATURA: ");
		double Esta=Double.parseDouble(sc.nextLine());
		pers2.setEstatura(Esta);


Como hemos dicho, con esto conseguimos que todas las lecturas se acepten con "punto decimal" (al menos en mi caso, puede que sea "coma decimal" en otros.)


Pero no evita que el programa se interrumpa en el caso de que un usuario utilice la "coma decimal" por error.
Claro, lo ideal sería que nuestro programa acepte por igual valores con punto y valores con coma.
En este caso, podemos hacer un paso previo antes de "parsear" los valores.
Y sería leer primero como String, reemplazar la posible "coma decimal" por un "punto", y ahora sí hacer el parseo.
1
2
3
4
5
6
7
8
9
10
11
System.out.print("ESCRIBA SU PESO: ");
		String pesoScan = sc.nextLine();
		pesoScan = pesoScan.replaceAll(",", ".");
		double Pe=Double.parseDouble(pesoScan);
		pers2.setPeso(Pe);
 
		System.out.print("ESCRIBA SU ESTATURA: ");
		String estaturaScan = sc.nextLine();
		estaturaScan = estaturaScan.replaceAll(",", ".");
		double Esta=Double.parseDouble(estaturaScan);
		pers2.setEstatura(Esta);

De esta forma, si ejecutamos el programa, veremos que el programa acepta valores con cualquier separador decimal, porque garantizamos que todos los parseos se van hacer con "punto decimal", aunque el usuario haya usado la "coma".
Fíjate en este ejemplo, donde peso y estatura los introduzco con distintos separadores decimales y no hay problema
1
2
3
4
5
6
7
8
9
10
11
12
13
ESCRIBA SU NOMBRE: Kabuto
ESCRIBA SU APELLIDO: Koji
ESCRIBA SU DIRECCION: c/ Java
ESCRIBA SU EDAD: 40
ESCRIBA SU PESO: 88.7
ESCRIBA SU ESTATURA: 1,86
NOMBRE: Kabuto
APELLIDO:Koji
DIRECCION: c/ Java
EDAD: 40
Peso 88.7
Estatura 1.86
USTED ES MAYOR DE EDAD

Ese mismo proceso, habría que hacerlo también con las lectura de los JOptionPane.
Pero no es óptimo repetir tantas veces estos pasos. Aquí lo ideal sería realizar este proceso en un método. Así solo hay que escribirlo una vez y podemos reutilizarlo todas las veces que queramos.
De hecho, ese método sería tan simple como esto:
1
2
3
private static String leerDecimal(String lectura) {
		return lectura.replaceAll(",", ".");
	}

Y ahora podemos usarlo tanto al leer con JOptionPane, como con Scanner, para garantizar que todos los parseos se harán con "punto decimal"
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class Principal
{
 
	public static void main(String[] args)
	{
		//Instancia
		Persona pers1=new Persona();
		pers1.setNombres(JOptionPane.showInputDialog("ESCRIBA SU NOMBRE"));
		pers1.setApellidos(JOptionPane.showInputDialog("ESCRIBA SU APELLIDO"));
		pers1.setDireccion(JOptionPane.showInputDialog("ESCRIBA SU DIREECION "));
		pers1.setEdad(Integer.parseInt(JOptionPane.showInputDialog("ESCRIBA SU EDAD ")));
		pers1.setPeso(Double.parseDouble(leerDecimal(JOptionPane.showInputDialog ("ESCRIBE SU PESO"))));
		pers1.setEstatura(Double.parseDouble(leerDecimal(JOptionPane.showInputDialog ("ESCRIBE SU ESTATURA"))));
 
		System.out.println("NOMBRE: "+pers1.GetNombres());
		System.out.println("APELLIDOS: "+pers1.GetApellidos());
		System.out.println("DIRECCION: "+pers1.GetDireccion());
		System.out.println("EDAD: "+pers1.GetEdad());
		/*System.out.println("PESO: "+pers1.GetPeso());
    System.out.println("ESTATURA: "+pers1.GetEstatura());*/
		pers1.Mostrar();
		pers1.validar();
 
		Persona pers2=new Persona();
		Scanner sc=new Scanner(System.in);
 
		System.out.print("ESCRIBA SU NOMBRE: ");
		String Nom=sc.nextLine();
		pers2.setNombres(Nom);
 
		System.out.print("ESCRIBA SU APELLIDO: ");
		String Ape=sc.nextLine();
		pers2.setApellidos(Ape);
 
		System.out.print("ESCRIBA SU DIRECCION: ");
		String Dir=sc.nextLine();
		pers2.setDireccion(Dir);
 
		System.out.print("ESCRIBA SU EDAD: ");
		int Edad=Integer.parseInt(sc.nextLine());
		pers2.setEdad(Edad);
 
		System.out.print("ESCRIBA SU PESO: ");
		double Pe=Double.parseDouble(leerDecimal(sc.nextLine()));
		pers2.setPeso(Pe);
 
		System.out.print("ESCRIBA SU ESTATURA: ");
		double Esta=Double.parseDouble(leerDecimal(sc.nextLine()));
		pers2.setEstatura(Esta);
 
		System.out.println("NOMBRE: "+pers2.GetNombres());
		System.out.println("APELLIDO:"+pers2.GetApellidos());
		System.out.println("DIRECCION: "+pers2.GetDireccion());
		System.out.println("EDAD: "+pers2.GetEdad());
		// System.out.println("PESO: "+pers2.GetPeso());
		// System.out.println("ESTATURA: "+pers2.GetEstatura());
 
 
		pers2.Mostrar();
		pers2.validar();
 
	}
 
	private static String leerDecimal(String lectura) {
		return lectura.replaceAll(",", ".");
	}
 
}


Esta no es la solución perfecta, porque la verdad no estoy seguro de si funcionaría en sistemas de otras regiones.
Pero bueno, como dije antes, te puede servir para no complicarte la vida demasiado.
Ya has visto que en realidad esta solución son apenas 4 líneas de código y permite que te puedas centrar en aprender otras cosas más importantes sin encontrarte con estos errores.

Pregunta si algo no ha quedado claro y necesitas más explicaciones.
Saludos.
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
sin imagen de perfil

Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.t

Publicado por Emanuel (9 intervenciones) el 02/11/2022 17:29:13
gracias de nuevo kabuto, entendí todo lo que me dijiste, a la perfeccion. Efectivamente si lo escribo con coma el código, no me da error, gracias. lo voy a hacer como digites
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