Skip to content

Fixing Java Scanner: Why nextLine() Skips Input and How to Fix It

In many Java developer communities, beginners and even intermediate developers often run into a frustrating quirk with the java.util.Scanner class. A developer recently posted a snippet where they were asking for a user’s age using nextInt() and then their name using nextLine(). To their surprise, the program skipped the name prompt entirely and moved to the next block of code.

I have seen this issue countless times in code reviews. It is not a bug in the Java language, but rather a misunderstanding of how the Scanner buffer handles whitespace and newline characters.

Here is the classic scenario where the error occurs (Java 8/11/17/21):

Scanner scan = new Scanner(System.in);
System.out.print("Enter your age: ");
int age = scan.nextInt(); // User types '25' and hits Enter
System.out.print("Enter your name: ");
String name = scan.nextLine(); // This is skipped or returns an empty string!
System.out.println("Age: " + age + ", Name: " + name);

The most common way to resolve this is to “consume” the leftover newline character by adding an extra nextLine() call immediately after your numeric input.

// Fix for Java 8+ (Illustrative example)
System.out.print("Enter your age: ");
int age = scan.nextInt();
scan.nextLine(); // The "Buffer Flush": Consumes the \n character left behind
System.out.print("Enter your name: ");
String name = scan.nextLine(); // Now this works as expected

Detailed Explanation: The “Newline” Trap

Section titled “Detailed Explanation: The “Newline” Trap”

To understand why this happens, you have to look at how Scanner processes the input stream.

When you type 25 and hit Enter, the input stream actually contains 25\n (where \n is the newline character).

  1. scan.nextInt(): This method looks for the next integer. It finds 25, consumes it, and stops. It leaves the \n character sitting in the buffer.
  2. scan.nextLine(): This method is designed to read everything until it hits a newline character. Because the \n from the previous step is still there, nextLine() sees it immediately, thinks the line is finished, and returns an empty string.

This behavior applies to all next...() methods (like next(), nextDouble(), nextFloat()) except for nextLine().


Solution A: The “Buffer Flush” (Simplest)

Section titled “Solution A: The “Buffer Flush” (Simplest)”

As shown above, you simply call scan.nextLine() to clear the buffer. This is best for small CLI tools or school assignments.

Pros: Easy to implement. Cons: Can make code look cluttered if you have many numeric inputs.

Solution B: The Parsing Method (Best Practice)

Section titled “Solution B: The Parsing Method (Best Practice)”

A more robust way to handle CLI input is to always read the entire line as a String and then parse it into the data type you need. This avoids the buffer issue entirely.

// Java 11+ (Illustrative example)
Scanner scan = new Scanner(System.in);
System.out.print("Enter your age: ");
// Read the whole line and convert to integer
int age = Integer.parseInt(scan.nextLine());
System.out.print("Enter your name: ");
String name = scan.nextLine(); // No skipping occurs

Pros: Cleanest approach; keeps the buffer clear at all times. Cons: Requires handling NumberFormatException if the user enters non-numeric text.


  • Mixed Input Sources: If you are using Scanner to read from a file rather than System.in, this behavior remains the same. However, you must ensure your file has consistent line endings (\r\n on Windows vs \n on Unix).
  • Delimiter Changes: If you change the scanner’s delimiter using scan.useDelimiter(), the behavior of nextLine() might change, as it ignores the custom delimiter and specifically looks for line separators.
  • Scanner Closing: If you are using Scanner(System.in), do not close the scanner until your program is ready to exit. Closing it will also close System.in, and you won’t be able to reopen it during the same program execution.

1. Is Scanner the fastest way to read input in Java? No. For high-performance needs (like competitive programming or processing massive text files), BufferedReader combined with StringTokenizer is significantly faster because Scanner uses regex internally, which adds overhead.

2. Does this issue happen with BufferedReader? Not in the same way. BufferedReader.readLine() always consumes the entire line, including the newline character. The issue is unique to Scanner because it provides specific methods like nextInt() that only consume a portion of the input stream.

3. How should I handle invalid numeric input with the Parsing Method? You should wrap the parsing in a try-catch block:

int age;
try {
age = Integer.parseInt(scan.nextLine());
} catch (NumberFormatException e) {
System.out.println("Please enter a valid number.");
age = 0;
}