Résoluxa0: Java Scanner NextLine Skips

Shikha Chaudhary 16 février 2024
Résoluxa0: Java Scanner NextLine Skips

Lors de l’utilisation de la méthode nextLine() après la méthode next() ou nextInt() en Java, parfois la méthode nextLine() saute l’entrée en cours à lire et passe à l’entrée suivante. Cet article expliquera pourquoi cela se produit et comment résoudre ce problème.

Avant d’examiner le problème avec la méthode nextLine(), commençons par comprendre le fonctionnement de la méthode nextLine(). Cette méthode appartient à la classe java.util.Scanner.

Cette fonction imprime la ligne entière à l’exception du séparateur de ligne à la fin. Il recherche une entrée à la recherche d’un séparateur de ligne. Si aucun séparateur de ligne n’est trouvé, il peut rechercher toutes les entrées tout en recherchant la ligne à ignorer.

Cette méthode de scanner va au-delà de la ligne actuelle. S’il y a une entrée qui a été ignorée, il la renvoie. Suivez ce lien pour vous référer à la documentation de la méthode.

Syntaxe:

public String nextLine()

Notez que cette fonction ne prend aucun paramètre et renvoie la ligne sautée. Regardez l’exemple ci-dessous pour voir comment cela fonctionne.

// 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());
  }
}

Production :

Java
 is
 intriguing

L’utilisation principale de la méthode nextLine() en Java est de lire une entrée de chaîne avec un espace.

Notez que nous pouvons également utiliser la méthode next() pour saisir une chaîne, mais elle ne lit que jusqu’au premier espace rencontré. De plus, la méthode next() place le curseur dans la même ligne après avoir pris l’entrée.

Cependant, la méthode nextLine() place le curseur dans la ligne suivante après avoir lu l’entrée. Regardez l’exemple ci-dessous.

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);
  }
}

Production :

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

Here is the output:
Harry
Harry Potter

Notez que la méthode next() ne lit que le prénom avant l’espace et ignore le reste. Cependant, la méthode nextLine() lit la chaîne entière avec un espace.

Le problème avec la méthode nextLine()

Pour comprendre ce problème, regardez l’exemple ci-dessous.

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);
  }
}

Production :

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

Mais la sortie requise est celle-ci :

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

Notez que la méthode nextLine() ignore l’entrée pour Name et passe à la place à l’entrée suivante pour la branche.

Pourquoi ce problème se produit-il

Cela se produit parce que lorsque la méthode nextInt() de la classe Scanner lit le numéro de rouleau, elle renvoie la valeur 1. Cette valeur est stockée dans la variable numéro.

Mais le curseur ne passe pas à la ligne suivante après avoir lu le numéro de matricule. Il reste juste après 1. Comme ça:

1_ // the cursor remains here only

Par conséquent, lorsque nous utilisons la méthode nextLine() pour lire le nom, elle commence à lire l’entrée à partir de la position actuelle du curseur. Donc après 1, la ligne suivante n’est rien d’autre que la nouvelle ligne elle-même. Le caractère \n représente cette nouvelle ligne. Ainsi, le nom est simplement \n.

Comment résoudre ce problème de Java Scanner NextLine Skips

Il existe deux façons de résoudre ce problème.

Utilisation de la méthode Java Integer.parseInt()

La méthode parseInt() appartient à la classe Integer du package java.lang et renvoie le type de données primitif d’une certaine chaîne. Ces méthodes sont principalement de deux types :

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

Pour travailler avec les sauts nextLine(), nous utiliserons la première méthode - Integer.parseInt(String s). Cela lit la ligne complète pour l’entier en tant que chaîne. Plus tard, il le convertit en entier.

Syntaxe:

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

Implémentons le même code que nous avons utilisé ci-dessus avec la méthode Java Integer.parseInt() et rectifions le problème.

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);
  }
}

Production :

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

Cette fois, le code fonctionne correctement. Mais nous ne pouvons pas l’utiliser pour la chaîne d’entrée après Byte character(Byte.parseByte(sc.nextLine())).

Nous pouvons utiliser la deuxième méthode dans ce cas. Voici le lien vers documentation pour plus d’informations.

Utilisation d’une instruction supplémentaire nextLine()

Cela consomme la nouvelle ligne restante. Regardez l’exemple.

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);
  }
}

Production :

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

Article connexe - Java Error

Article connexe - Java Scanner