Buenos días.
Haciendo el segundo ejercicio de la entrega CU00903C del curso de programación java nivel avanzado, me ha surgido una duda relacionada con el Scanner.
Esta fue mi primera versión del ejercicio. Al ejecutar el programa, la consola no me permitía introducir el nombre del segundo alumno y almacenaba una cadena vacía.
package javaAvanzado;
import java.util.Scanner;
public class NotasAlumnos {
public static void main (String [] args) {
String [] alumno = new String [2];
String [] notaTexto = {"Suspenso", "Bien", "Notable", "Sobresaliente"};
double [] nota = new double [2];
String calificacion;
//Primer alumno.
System.out.println ("Introduce el nombre del primer alumno.");
Scanner entrada = new Scanner (System.in);
String respuesta = entrada.nextLine();
alumno[0]=respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
double respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + "no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[0]=respuestaNota;
//Segundo alumno.
System.out.println ("Introduce el nombre del segundo alumno.");
respuesta= entrada.nextLine();
alumno[1] = respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + " no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[1] = respuestaNota;
//Calificaciones.
System.out.println ("Calificaciones:");
for (int i=0; i<=1; i++) {
if (nota[i]<5) {calificacion=notaTexto[0];}
else if (nota[i]>=5 && nota[i]<7) {calificacion = notaTexto[1];}
else if (nota[i]>=7&& nota[i]<9) {calificacion = notaTexto[2];}
else {calificacion=notaTexto[3];}
System.out.println (alumno[i]+" : "+nota[i]+ " ("+calificacion+").");
}
}
}
Introduce el nombre del primer alumno.
Mario
Introduce la nota de Mario.
9,99
Introduce el nombre del segundo alumno.
Introduce la nota de .
7
Calificaciones:
Mario : 9.99 (Sobresaliente).
: 7.0 (Notable).
Al introducir un segundo Scanner para el segundo alumno, el problema se solucionó, pero no entiendo el porqué. En otras partes del programa he podido reutilizar la variable "entrada" para recoger la nota escribiendo entrada.nextDouble(), sin necesidad de crear un nuevo objeto Scanner.
Esta es la versión que funciona.
package javaAvanzado;
import java.util.Scanner;
public class NotasAlumnos {
public static void main (String [] args) {
String [] alumno = new String [2];
String [] notaTexto = {"Suspenso", "Bien", "Notable", "Sobresaliente"};
double [] nota = new double [2];
String calificacion;
//Primer alumno.
System.out.println ("Introduce el nombre del primer alumno.");
Scanner entrada = new Scanner (System.in);
String respuesta = entrada.nextLine();
alumno[0]=respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
double respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + "no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[0]=respuestaNota;
//Segundo alumno.
System.out.println ("Introduce el nombre del segundo alumno.");
Scanner entrada2 = new Scanner (System.in);
respuesta= entrada2.nextLine();
alumno[1] = respuesta;
System.out.println ("Introduce la nota de "+respuesta+".");
respuestaNota = entrada.nextDouble();
if (respuestaNota<0||respuestaNota>10) { System.out.println (respuestaNota + " no es un valor válido. Introduce una nota de 0 a 10.");
respuestaNota = entrada.nextDouble();}
nota[1] = respuestaNota;
//Calificaciones.
System.out.println ("Calificaciones:");
for (int i=0; i<=1; i++) {
if (nota[i]<5) {calificacion=notaTexto[0];}
else if (nota[i]>=5 && nota[i]<7) {calificacion = notaTexto[1];}
else if (nota[i]>=7&& nota[i]<9) {calificacion = notaTexto[2];}
else {calificacion=notaTexto[3];}
System.out.println (alumno[i]+" : "+nota[i]+ " ("+calificacion+").");
}
}
}
Gracias de antemano por vuestras respuestas.