Why is Scanner skipping nextLine() after use of other next functions?

02 Sep, 2021
The nextLine() method of java.util.Scanner class advances this scanner past the current line and returns the input that was skipped. This function prints the rest of the current line, leaving out the line separator at the end. The next is set to after the line separator. Since this method continues to search through the input looking for a line separator, it may search all of the input searching for the line to skip if no line separators are present.
Syntax:
public String nextLine()
What is the Issue with nextLine() method?
Consider the following code example: 
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);    }}
When this code is run against the input: 
abc
m
1
xyz
pqr
Expected Output: 
Name: abc
Gender: m
Age: 1
Father's Name: xyz
Mother's Name: pqr
Actual Output: 
Name: abc
Gender: m
Age: 1
Father's Name: 
Mother's Name: xyz
As you can see, the nextLine() method skips the input to be read and takes the name of Mother in the place of Father. Hence the expected output does not match with the actual output. This error is very common and causes a lot of problems.
Why does this issue occur? This issue occurs because, when nextInt() method of Scanner class is used to read the age of the person, it returns the value 1 to the variable age, as expected. But the cursor, after reading 1, remains just after it.
abc
m
1_ // Cursor is here
xyz
pqr
So when the Father’s name is read using nextLine() method of Scanner class, this method starts reading from the cursor’s current position. In this case, it will start reading just after 1. So the next line after 1 is just a new line, which is represented by ‘\n’ character. Hence the Father’s name is just ‘\n’.
How to solve this issue? This issue can be solved by either of the following two ways:  
1. reading the complete line for the integer and converting it to an integer, or
Syntax: 
// Read the complete line as String
// and convert it to integer
int var = Integer.parseInt(sc.nextLine());
Although this method is not applicable for input String after Byte character(Byte.parseByte(sc.nextLine()). Second method is applicable in that case.
2. by consuming the leftover new line using the nextLine() method.
Syntax: 
// Read the integer
int var = sc.nextInt();

// Read the leftover new line
sc.nextLine();
Below example shows how to solve this issue with nextLine() method: 
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);    }}
When this code is run against the input: 
abc
m
1
xyz
pqr
Expected Output: 
Name: abc
Gender: m
Age: 1
Father's Name: xyz
Mother's Name: pqr
Actual Output: 
Name: abc
Gender: m
Age: 1
Father's Name: xyz
Mother's Name: pqr
manishgnext
amanpreet9391
gulshankumarar231
Java-Scanner
Java
Java
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.