2017-04-22 1 views
1

J'ai rencontré un problème plutôt étrange avec l'entrée de Java Scanner. J'ai fait un programme de pratique qui lit d'abord un double en utilisant nextDouble(), sort un texte trivial et utilise ensuite le même objet scanner pour obtenir une entrée de chaîne en utilisant nextLine().L'analyseur Java ignore l'entrée nextLine() mais pas la suivante()

Voici le code:

import java.util.Scanner; 

public class UsrInput { 
    public static void main(String[] args) { 

     //example with user double input 
     Scanner reader = new Scanner(System.in); 
     System.out.println("Enter a number: "); 
     double input = reader.nextDouble(); 
     if(input % 2 == 0){ 
      System.out.println("The input was even"); 
     }else if(input % 2 == 1){ 
      System.out.println("The input was odd"); 
     }else{ 
      System.out.println("The input was not an integer"); 
     } 

     //example with user string input 
     System.out.println("Verify by typing the word 'FooBar': "); 
     String input2 = reader.nextLine(); 
     System.out.println("The string equal 'FooBar': " + input2.equals("FooBar")); 
    }  
} 

Maintenant, évidemment, mon intention est de demander une seconde entrée, et imprimer s'il est vrai ou faux que la input2 chaîne est égale à « foobar ». Cependant quand je cours ceci il saute la deuxième entrée et immédiatement me dit que ce n'est pas égal. Cependant si je change reader.nextLine() à reader.next() il fonctionne soudainement.

Il fonctionne aussi si je crée une nouvelle instance de scanner et d'utiliser reader2.nextLine()

Alors ma question est pourquoi est mon objet Scanner ne me demande pas de nouvelles entrées? Si j'imprime la valeur de "input2" c'est vide.

+0

http://stackoverflow.com/questions/13102045/scanner- est-sauter-nextline-après-utiliser-next-nextint-ou-autre-nextfoo? rq = 1 –

+0

C'est en effet le même problème (je ne pouvais pas le trouver dans la recherche), mais il me laisse toujours à me demander pourquoi le problème se produit avec nextLine() après nextDouble() mais pas avec next()? Est-ce que next() simlpy ignore le retour à la ligne dans le buffer> –

Répondre

1

Vous devez effacer votre scanner afin que vous puissiez utiliser reader.nextLine();, comme ceci:

if (input % 2 == 0) { 
    System.out.println("The input was even"); 
} else if (input % 2 == 1) { 
    System.out.println("The input was odd"); 
} else { 
    System.out.println("The input was not an integer"); 
} 


reader.nextLine();//<<--------------Clear your Scanner so you can read the next input 


//example with user string input 
System.out.println("Verify by typing the word 'FooBar': "); 
String input2 = reader.nextLine(); 
System.out.println("The string equal 'FooBar': " + input2.equals("FooBar")); 

Modifier

pourquoi ne 'next()' ignorer \ n encore laissé dans le scanner?

Vous comprendrez cet exemple ici:

next()

public static void main(String[] args) { 
    String str = "Hello World! Hello Java!"; 

    // create a new scanner with the specified String Object 
    Scanner scanner = new Scanner(str); 

    while(scanner.hasNext()){ 
     System.out.println(scanner.next()); 
    } 
    scanner.close(); 
} 

Sortie

Hello 
World! 
Hello 
Java! 

nextLine()

public static void main(String[] args) { 
    String str = "Hello World!\nHello Java!"; 

    // create a new scanner with the specified String Object 
    Scanner scanner = new Scanner(str); 

    while(scanner.hasNext()){ 
     System.out.println(scanner.nextLine()); 
    } 
    scanner.close(); 
} 

Sortie

Hello World! 
Hello Java! 

On peut donc comprendre que next() lire mot par mot il ne pas utiliser \ n comme nextLine()

+0

Merci, cela résout en effet mon problème et il semble que ma question ait déjà été posée et répondue ailleurs. Cela me laisse une question: pourquoi 'next()' ignore-t-il le \ n qui reste dans le scanner? –

+0

@Dr.Hoenikker lire ensuite mot par mot séparé par un espace, pas comme nextLine() il utilise \ n vous pouvez comprendre plus dans mon exemple –

+0

Ok cela fait sens, next() ignore tout simplement les espaces et les nouvelles lignes tout de même, et dans mon exemple ignore le \ n à partir de nextDouble() et attend ma saisie! –