¿Por qué Scanner salta nextLine() después de usar otras funciones next?

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

Publicación traducida automáticamente

Artículo escrito por Code_r y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *