web-dev-qa-db-fra.com

Obtenir l'utilisateur avec le scanner

J'essaye de faire en sorte qu'un scanner prenne une entrée en boucle. Une fois que l'utilisateur veut terminer, il peut quitter cette boucle. J'ai essayé de nombreuses façons de le faire mais il y a toujours un problème. C'est le code:

private void inputEntries() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Continue?[Y/N]");
    while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
        System.out.println("Enter first name");
        String name = sc.nextLine();
        System.out.println("Enter surname");
        String surname = sc.nextLine();
        System.out.println("Enter number");
        int number = sc.nextInt();
        Student student = new Student(name, surname, number);
        students.add(student);
        try {
            addToFile(student);
        } catch (Exception ex) {
            Logger.getLogger(TextReader.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("Continue?[Y/N]");
    }
}

Le problème avec le code ci-dessus, qui se produit également sur différentes méthodes que j'ai essayées, est que lorsque l'utilisateur tapeY, la Scanner saute la première entrée du prénom et passe au nom de famille. Si l'utilisateur tapeN, la boucle s'arrête correctement. Quelqu'un peut expliquer la raison pour laquelle cela se produit et comment surmonter l'utilisation de Scanner class?

p.s: Faire quelque chose comme while(sc.nextLine().equals("Y")), entraînera la fin de la boucle avant la saisie de l'utilisateur après la première exécution de la boucle.

7
Giannis

C'est parce que vous utilisez Scanner#next méthode. Et si vous regardez la documentation de cette méthode, elle renvoie le prochain jeton lu. 

Ainsi, lorsque vous lisez l'entrée utilisateur à l'aide de la méthode next, elle ne lit pas la newline à la fin. Ce qui est alors lu par la nextLine() dans la boucle while. Et ainsi, votre firstName contient une newline sans que vous le sachiez.

Donc, vous devriez utiliser nextLine() dans votre while plutôt que next().

Il en va de même avec nextInt method. Il ne lit pas non plus la nouvelle ligne. Donc, vous pouvez read utiliser readLine et le convertir en int en utilisant Integer.parseInt. Il peut générer NumberFormatException si la valeur d'entrée ne peut pas être convertie en int. Donc, vous devez le gérer en conséquence.

Vous pouvez essayer le code ci-dessous: -

Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");
while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here
    System.out.println("Enter first name");
    String name = sc.nextLine();
    System.out.println("Enter surname");
    String surname = sc.nextLine();
    System.out.println("Enter number");
    int number = 0;
    try {
        number = Integer.parseInt(sc.nextLine());
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    }
    System.out.println("Continue?[Y/N]");
}

Cependant, notez une chose: si vous entrez une valeur qui ne peut pas être passée à Integer.parseInt, vous obtiendrez une exception et cette entrée sera ignorée. Dans ce cas, vous devez le gérer en utilisant la boucle while.

Ou, si vous ne souhaitez pas gérer cette exception: -

Vous pouvez ajouter un empty sc.nextLine() après sc.nextInt(), qui consommera la newline restante, comme ceci: -

    // Left over part of your while loop

    String surname = sc.nextLine();
    System.out.println("Enter number");
    int number = sc.nextInt();
    sc.nextLine(); // To consume the left over newline;
    System.out.println("Continue?[Y/N]");
9
Rohit Jain
  • Utilisez equalsIgnoreCase(..) pour éviter que la casseYouNne soit en minuscule et vice versa.
  • N'utilisez pas sc.next() plutôt que sc.nextLine() pour obtenir ce que vous voulez, car next() ne lit que jusqu'à l'espace suivant, alors que nextLine() se lit jusqu'au prochain saut \n.
  • N'utilisez pas nextInt() lire toutes les données sous la forme String puis convertissez-les car nextInt() est comme next() et ne lit donc pas jusqu'au prochain\n .

Essayez comme ça:

Scanner sc = new Scanner(System.in);
System.out.println("Continue?[Y/N]");

while (sc.hasNext() && (sc.nextLine().equalsIgnoreCase("y"))) {//change here

    System.out.println("Enter first name");
    String name = sc.nextLine();

    System.out.println("Enter surname");
    String surname = sc.nextLine();

    System.out.println("Enter number");

    int number=0;

    try {
    number = Integer.parseInt(sc.nextLine());//read int as string using nextLine() and parse
    }catch(NumberFormatException nfe) {
        nfe.printStackTrace();
    }

    System.out.println("Continue?[Y/N]");
}
4
David Kroukamp
public void display() {
    int i, j;
    for (i = 1; i <= 5; i++) {
        for (j = i; j < 5; j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(i % 2);
        }
        for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(j);
        }
        System.out.println();
    }
    for (i = 4; i >= 1; i--) {
        for (j = i; j < 5; j++) {
            System.out.print(" ");
        }
        for (j = 1; j <= i; j++) {
            System.out.print(j);
        }
        for (j = i - 1; j >= 1; j--) {
            System.out.print(j);
        }
        for (j = 1; j < ((5 * 2) - (i * 2)); j++) {
            System.out.print(" ");
        }
        for (j = 1; j < (2 * i); j++) {
            System.out.print(j);
        }
        System.out.println();
    }
}
1

Vous pourriez utiliser

String abc = "abc";
String answer = "null";
while (abc.equals("abc")
{
if (answer.equals("n")
{
break;
}
while (answer.equals("y"))
{
//Put your other code here
System.out.print("Continue? [y/n]")
answer = input.nextLine();
if (answer.equals("n")
{
break;
}
}
}

Cela devrait arrêter le programme lorsque l'entrée est

"n"

Vous devrez également importer et créer le scanner comme ceci:

//This is how you import the Scanner
import Java.util.Scanner;
//This is how you create the Scanner
Scanner input = new Scanner(System.in);
/**
*The name
*/
"input"
/**
*is used because of
*/
input.nextLine
1
spacegeek224