El método nextLine() de la clase java.util.Scanner avanza este escáner más allá de la línea actual y devuelve la entrada que se omitió. Esta función imprime el resto de la línea actual, omitiendo el separador de línea al final. El siguiente se establece después del separador de línea. Dado que este método continúa buscando a través de la entrada en busca de un separador de línea, puede buscar en toda la entrada buscando la línea para omitir si no hay separadores de línea presentes.
Sintaxis:
public String nextLine()
¿Cuál es el problema con el método nextLine()?
Considere el siguiente ejemplo de código:
Java
// Java program to show the issue with // nextLine() method of Scanner Class import java.util.Scanner; public class ScannerDemo1 { public static void main(String[] args) { // Declare the object and initialize with // predefined standard input object Scanner sc = new Scanner(System.in); // Taking input String name = sc.nextLine(); char gender = sc.next().charAt(0); int age = sc.nextInt(); String fatherName = sc.nextLine(); String motherName = sc.nextLine(); // Print the values to check // if the input was correctly obtained. System.out.println("Name: " + name); System.out.println("Gender: " + gender); System.out.println("Age: " + age); System.out.println("Father's Name: " + fatherName); System.out.println("Mother's Name: " + motherName); } }
- Cuando este código se ejecuta contra la entrada :
abc m 1 xyz pqr
- Rendimiento esperado:
Name: abc Gender: m Age: 1 Father's Name: xyz Mother's Name: pqr
- Salida real:
Name: abc Gender: m Age: 1 Father's Name: Mother's Name: xyz
Como puede ver, el método nextLine() omite la entrada que se va a leer y toma el nombre de Madre en lugar de Padre. Por lo tanto, la salida esperada no coincide con la salida real. Este error es muy común y causa muchos problemas.
¿Por qué ocurre este problema?
Este problema ocurre porque, cuandométodo nextInt() de la clase Scanner para leer la edad de la persona, devuelve el valor 1 a la variable edad, como se esperaba. Pero el cursor, después de leer 1, permanece justo después.
abc m 1_ // Cursor is here xyz pqr
Entonces, cuando se lee el nombre del Padre usando el método nextLine() de la clase Scanner , este método comienza a leer desde la posición actual del cursor. En este caso, comenzará a leer justo después de 1. Por lo tanto, la siguiente línea después de 1 es solo una nueva línea, que se representa con el carácter ‘\n’. Por lo tanto, el nombre del Padre es simplemente ‘\n’.
¿Cómo resolver este problema?
Este problema se puede resolver de cualquiera de las dos maneras siguientes:
1. leer la línea completa del número entero y convertirlo en un número entero, o
Sintaxis:
// Read the complete line as String // and convert it to integer int var = Integer.parseInt(sc.nextLine());
Aunque este método no es aplicable para la string de entrada después del carácter Byte (Byte.parseByte(sc.nextLine()). El segundo método es aplicable en ese caso.
2. consumiendo la nueva línea sobrante usando el método nextLine().
Sintaxis:
// Read the integer int var = sc.nextInt(); // Read the leftover new line sc.nextLine();
El siguiente ejemplo muestra cómo resolver este problema con el método nextLine():
Java
// Java program to solve the issue with // nextLine() method of Scanner Class import java.util.Scanner; import java.io.*; import java.lang.*; class ScannerDemo1 { public static void main(String[] args) { // Declare the object and initialize with // predefined standard input object Scanner sc = new Scanner(System.in); // Taking input String name = sc.nextLine(); char gender = sc.next().charAt(0); // Consuming the leftover new line // using the nextLine() method sc.nextLine(); // reading the complete line for the integer // and converting it to an integer int age = Integer.parseInt(sc.nextLine()); String fatherName = sc.nextLine(); String motherName = sc.nextLine(); // Print the values to check // if the input was correctly obtained. System.out.println("Name: " + name); System.out.println("Gender: " + gender); System.out.println("Age: " + age); System.out.println("Father's Name: " + fatherName); System.out.println("Mother's Name: " + motherName); } }
- Cuando este código se ejecuta contra la entrada :
abc m 1 xyz pqr
- Rendimiento esperado:
Name: abc Gender: m Age: 1 Father's Name: xyz Mother's Name: pqr
- Salida real:
Name: abc Gender: m Age: 1 Father's Name: xyz Mother's Name: pqr