Behoben: Java Scanner NextLine Skips

Shikha Chaudhary 16 Februar 2024
Behoben: Java Scanner NextLine Skips

Bei der Verwendung der nextLine()-Methode nach der next()- oder nextInt()-Methode in Java überspringt die nextLine()-Methode manchmal die aktuelle zu lesende Eingabe und geht zur nächsten Eingabe. In diesem Artikel wird erläutert, warum dies geschieht und wie dieses Problem behoben werden kann.

Bevor wir uns mit der Methode nextLine() befassen, wollen wir zunächst die Funktionsweise der Methode nextLine() verstehen. Diese Methode gehört zur Klasse java.util.Scanner.

Diese Funktion druckt die gesamte Zeile mit Ausnahme des Zeilentrenners am Ende. Es sucht nach einer Eingabe, die nach einem Zeilentrennzeichen sucht. Wenn kein Zeilentrennzeichen gefunden wird, wird möglicherweise die gesamte Eingabe durchsucht, während nach der zu überspringenden Zeile gesucht wird.

Diese Scannermethode geht über die aktuelle Zeile hinaus. Wenn eine Eingabe übersprungen wurde, wird sie zurückgegeben. Folgen Sie diesem Link, um auf die Dokumentation der Methode zuzugreifen.

Syntax:

public String nextLine()

Beachten Sie, dass diese Funktion keinen Parameter akzeptiert und die übersprungene Zeile zurückgibt. Sehen Sie sich das Beispiel unten an, um zu sehen, wie es funktioniert.

// To demonstrate the working of nextLine() method

import java.util.*;

public class Example {
  public static void main(String[] args) {
    String a = "Java \n is \n intriguing";

    // create a new scanner
    Scanner sc = new Scanner(a);

    // print the next line
    System.out.println(sc.nextLine());

    // print the next line again
    System.out.println(sc.nextLine());

    // print the next line again
    System.out.println(sc.nextLine());
  }
}

Ausgabe:

Java
 is
 intriguing

Die Hauptverwendung der Methode nextLine() in Java ist das Lesen einer Zeichenketteneingabe mit Leerzeichen.

Beachten Sie, dass wir auch die Methode next() verwenden können, um eine Zeichenfolge einzugeben, aber sie liest nur bis zum ersten Leerzeichen, auf das sie trifft. Auch die Methode next() setzt den Cursor nach der Eingabe in die gleiche Zeile.

Die Methode nextLine() setzt den Cursor jedoch nach dem Lesen der Eingabe in die nächste Zeile. Sehen Sie sich das folgende Beispiel an.

import java.util.*;
public class Demo {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // Try reading a string with space using next()
    System.out.println("Enter the name of a movie");
    String name = sc.next();

    // Done to bring the cursor to next line
    sc.nextLine();

    // Re-reading the string using nextLine()
    System.out.println("Re-enter this name");
    String rename = sc.nextLine();

    System.out.println();
    System.out.println("Here is the output:");

    // printing the output
    System.out.println(name);
    System.out.println(rename);
  }
}

Ausgabe:

Enter the name of a movie
Harry Potter
Re-enter this name
Harry Potter

Here is the output:
Harry
Harry Potter

Beachten Sie, dass die Methode next() nur den Vornamen vor dem Leerzeichen liest und den Rest ignoriert. Die Methode nextLine() liest jedoch den gesamten String mit Leerzeichen.

Das Problem mit der Methode nextLine()

Um dieses Problem zu verstehen, sehen Sie sich das folgende Beispiel an.

import java.util.Scanner;
public class Demo {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // This part takes the input
    System.out.println("Input the Roll Number:");
    int number = sc.nextInt();
    System.out.println("Input your full name:");
    String name = sc.nextLine();
    System.out.println("Input your branch:");
    String branch = sc.nextLine();

    // This part prints the values
    System.out.println("Roll No: " + number);
    System.out.println("Name: " + name);
    System.out.println("Branch: " + branch);
  }
}

Ausgabe:

Input the Roll Number:
1
Input your full name:
Input your branch:
Computer Science
Roll No: 1
Name:
Branch: Computer Science

Aber die erforderliche Ausgabe ist diese:

Input the Roll Number : 1 Input your full name : Harry Potter Input your branch
    : Computer Science Roll No : 1 Name : Harry Potter Branch : Computer Science

Beachten Sie, dass die Methode nextLine() die Eingabe für Name überspringt und stattdessen zur nächsten Eingabe für die Verzweigung geht.

Warum tritt dieses Problem auf

Dies geschieht, weil die Methode nextInt() der Klasse Scanner beim Lesen der Rollennummer den Wert 1 zurückgibt. Dieser Wert wird in der Variablennummer gespeichert.

Aber der Cursor springt nach dem Lesen der Rollennummer nicht in die nächste Zeile. Es bleibt kurz nach 1. So was:

1_ // the cursor remains here only

Wenn wir also die Methode nextLine() zum Lesen des Namens verwenden, beginnt sie mit dem Lesen der Eingabe ab der aktuellen Position des Cursors. Die nächste Zeile nach 1 ist also nichts anderes als die neue Zeile selbst. Das Zeichen \n repräsentiert diese neue Zeile. Der Name ist also nur \n.

So beheben Sie dieses Problem von Java Scanner NextLine Skips

Es gibt zwei Möglichkeiten, wie wir dieses Problem beheben können.

Mit der Java-Methode Integer.parseInt()

Die Methode parseInt() gehört zur Klasse Integer des Pakets java.lang und gibt den primitiven Datentyp eines bestimmten Strings zurück. Bei diesen Methoden handelt es sich hauptsächlich um zwei Arten:

  • Integer.parseInt(String s)
  • Integer.parseInt(String s, int radix)

Um mit den nextLine()-Sprüngen zu arbeiten, verwenden wir die erste Methode – Integer.parseInt(String s). Dies liest die komplette Zeile für die Ganzzahl als String. Später konvertiert es es in eine ganze Zahl.

Syntax:

int value = Integer.parseInt(sc.nextLine());

Lassen Sie uns denselben Code, den wir oben verwendet haben, mit der Java-Methode Integer.parseInt() implementieren und das Problem beheben.

import java.util.Scanner;
public class Demo {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // This part takes the input
    System.out.println("Input the Roll Number:");

    // Using the parseInt() method this time
    int number = Integer.parseInt(sc.nextLine());
    System.out.println("Input your full name:");
    String name = sc.nextLine();
    System.out.println("Input your branch:");
    String branch = sc.nextLine();

    // This part prints the values
    System.out.println("Roll No: " + number);
    System.out.println("Name: " + name);
    System.out.println("Branch: " + branch);
  }
}

Ausgabe:

Input the Roll Number:
1
Input your full name:
Harry Potter
Input your branch:
Computer Science
Roll No: 1
Name: Harry Potter
Branch: Computer Science

Diesmal läuft der Code einwandfrei. Wir können dies jedoch nicht für die Eingabezeichenfolge nach Byte-Zeichen (Byte.parseByte(sc.nextLine())) verwenden.

In diesem Fall können wir die zweite Methode verwenden. Hier ist der Link zu Dokumentation für weitere Informationen.

Verwenden einer zusätzlichen nextLine()-Anweisung

Dies verbraucht die übrig gebliebene neue Zeile. Schau dir das Beispiel an.

import java.util.Scanner;
public class Demo {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    // This part takes the input
    System.out.println("Input the Roll Number:");
    int number = sc.nextInt();

    // An extra nextLine() to consume the leftover line
    sc.nextLine();

    System.out.println("Input your full name:");
    String name = sc.nextLine();
    System.out.println("Input your branch:");
    String branch = sc.nextLine();

    // This part prints the values
    System.out.println("Roll No: " + number);
    System.out.println("Name: " + name);
    System.out.println("Branch: " + branch);
  }
}

Ausgabe:

Input the Roll Number:
1
Input your full name:
Harry Potter
Input your branch:
Computer Science
Roll No: 1
Name: Harry Potter
Branch: Computer Science

Verwandter Artikel - Java Error

Verwandter Artikel - Java Scanner