Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Auxilio!

Error InputMismatchException
ME marca un error Exception in thread "main" java.util.InputMismatchException

public void Promedios5(){
Scanner Marbis=new Scanner(System.in);
String[] x=new String[5];
double[][] a=new double[5][4];
double[] b=new double [5],c=new double[5];
System.out.println("Este programa genera los promedios de las notas de cuatro unidades\n"
+ "se le solicitarán a usted, el nombre y las cuatro notas");
System.out.println("Podría ingresarlas ahora por favor:");
for(int y=0;y<=4;y++){
System.out.println("Ingrese el nombre:");
x[y]=Marbis.nextLine();
for(int z=0;z<=3;z++){
a[y][z]=Marbis.nextDouble();
}
b[y]=a[y][0]+a[y][1]+a[y][2]+a[y][3];
c[y]=b[y]/4;
}
System.out.println("Ahora usted verá los promedios de las personas:");
System.out.println("Nombre\t\t\t\tPromedio");
for(int m=0;m<=4;m++)
System.out.printf("%s:\t%.2f\n",x[m],c[m]);
}

run:
Este es un menú: Es lo que debo hacer, pero hasta el segundo ingreso me marca el error.

Seleccione un valor de la lista según quiera hacer el programa:
1. Lista de Cinco personas y su DPI
2. Notas de 10 personas, ya ingresadas
3. Ingresar Números y ordenarlos al revés
4. Determinar por lista, numeros pares e impares
5. 5 alumnos y sus Promedios 2014
5
Este programa genera los promedios de las notas de cuatro unidades
se le solicitarán a usted, el nombre y las cuatro notas
Podría ingresarlas ahora por favor:
Ingrese el nombre:
Juan
48.00
45.00
95.00
100.
Ingrese el nombre:
Pedro
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at vectormarbis1.MarbisVectors2.Promedios5(MarbisVectors2.java:125)
at vectormarbis1.VectorMarbis1.main(VectorMarbis1.java:28)
C:\Users\ManoloAurelio\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 23 seconds)

agosto 6, 2016 | Unregistered CommenterMarbisPowerJ

Cambia el nextLine() por next().

public void Promedios5(){
java.util.Scanner Marbis=new java.util.Scanner(System.in);
String[] x=new String[5];
double[][] a=new double[5][4];
double[] b=new double [5],c=new double[5];
System.out.println("Este programa genera los promedios de las notas de cuatro unidades\n"
+ "se le solicitarán a usted, el nombre y las cuatro notas");
System.out.println("Podría ingresarlas ahora por favor:");
for(int y=0;y<=4;y++){
System.out.println("Ingrese el nombre:");
x[y]=Marbis.next(); // <- LINEA CAMBIADA !!!
for(int z=0;z<=3;z++){
a[y][z]=Marbis.nextDouble();
}
b[y]=a[y][0]+a[y][1]+a[y][2]+a[y][3];
c[y]=b[y]/4;
}
System.out.println("Ahora usted verá los promedios de las personas:");
System.out.println("Nombre\t\t\t\tPromedio");
for(int m=0;m<=4;m++)
System.out.printf("%s:\t%.2f\n",x[m],c[m]);
}

agosto 7, 2016 | Registered Commenterangelns

Hola, soy yo de nuevo. Te di una repuesta que te puede causar problemas si a la hora de ingresar el nombre usas más de una palabra ya que estás utilizando un espacio en blanco que sirve como deimitador, Te explico:
El delimitador para separar los tokens que usa la clase Scanner son los carcteres en blanco como \t, \n, \r, y el caracter de espacio. Cuando ingresas una valor con nextInt, nextDouble, etc., estás dejando un salto de linea (\n); por lo tanto, a la hora de que llega de nuevo la parte de x[y]=Marbis.nextLine(), este método devuelve inmediatamente otra lienea pues a encontrado el salto de linea que dejó la última llamada a nextDouble. Por eso, cuando volvias a escribir el nombre, en realidad lo que te estaba pidiendo era un double y de ahí el error.
Sin embargo mi primera respuesta está equivocada ya que al llamar a next() te devuelve el siguiente valor hasta un espacio en blaco como ya te expliqué, a diferencia de nextLine que sólo lo hace hasta que se encuentra con una nueva linea; así, con el código que te di previamente si ponias dos o más tokens en una misma linea (entendiedo por token cada pedazo de la cadena seprado por un espacio en blaco) el primero se correnpondería con el ingreso del nombre (un string) y el segundo con un double.
¿La solución? Bueno, dejar la linea que modifiqué en mi repuesta anterior cómo estaba y consumir el salto de linea que deja la última invocación a nextDouble llamando de nuevo a nextLine() una vez terminado el bucle for interno. Te dejó de nuevo tú código con algunas modificaciones.
Espero me haya explicado bien. Saludos.

public class Promedio {

public static void main(String[] args) {
new Promedio().Promedios5();
}

public void Promedios5(){
java.util.Scanner Marbis=new java.util.Scanner(System.in);
System.out.println(Marbis.delimiter());
String[] x=new String[5];
double[][] a=new double[5][4];
double[] b=new double [5],c=new double[5];
System.out.println("Este programa genera los promedios de las notas de cuatro unidades\n"
+ "se le solicitarán a usted, el nombre y las cuatro notas");
System.out.println("Podría ingresarlas ahora por favor:");
for(int y=0;y<=4;y++){
System.out.println("-----------");
System.out.print("nombre> ");
x[y]=Marbis.nextLine();
for(int z=0;z<=3;z++){
System.out.print("double> ");
a[y][z]=Marbis.nextDouble();
}
Marbis.nextLine();
b[y]=a[y][0]+a[y][1]+a[y][2]+a[y][3];
c[y]=b[y]/4;
}
System.out.println("Ahora usted verá los promedios de las personas:");
System.out.println("Nombre\t\t\t\tPromedio");
for(int m=0;m<=4;m++)
System.out.printf("%s:\t%.2f\n",x[m],c[m]);
}
}

agosto 7, 2016 | Registered Commenterangelns