2017-04-22 4 views
1

Ich habe ein ziemlich seltsames Problem mit dem Java-Scanner gefunden, der Benutzereingaben erhält. Ich machte ein Übungsprogramm, das zuerst ein Doppel liest unter Verwendung nextDouble(), gibt etwas trivialen Text aus und benutzt dann das gleiche Scanner-Objekt, um eine Zeichenketteneingabe unter Verwendung nextLine() zu erhalten. HierJava-Scanner überspringt Eingabe nextLine(), aber nicht next()

ist der 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")); 
    }  
} 

Jetzt offensichtlich meine Absicht ist, für einen zweiten Eingang zu fragen, und drucken, wenn es wahr oder falsch ist, dass die Zeichenfolge input2 gleich ‚FooBar‘. Wenn ich das aber ausführe, überspringt es die zweite Eingabe und sagt mir sofort, dass es nicht gleich ist. Allerdings wenn ich reader.nextLine() zu reader.next() ändern, funktioniert es plötzlich.

Es funktioniert auch, wenn ich eine neue Scanner-Instanz erstellen und verwenden reader2.nextLine()

So ist meine Frage, warum ist mein Scanner Objekt mich nicht für neue Eingabe zu fragen? Wenn ich den Wert von "input2" ausdrucke, ist es leer.

+0

http://stackoverflow.com/questions/13102045/scanner- is-skipping-nextline-nach-using-next-nextint-oder-nextfoo? rq = 1 –

+0

Das ist in der Tat das gleiche Problem (ich konnte es nicht in der Suche finden), aber es lässt mich immer noch fragen, warum Problem tritt mit nextLine() nach nextDouble(), aber nicht mit next() auf? Ist next() simlpy ignorieren Sie die Newline im Puffer> –

Antwort

1

Sie haben Ihren Scanner zu löschen, so dass Sie reader.nextLine();, wie diese verwenden:

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

bearbeiten

warum 'next()' ignorieren die \ n noch links im Scanner?

Sie werden mit diesem Beispiel verstehen sich hier:

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

Ausgabe

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

Ausgabe

Hello World! 
Hello Java! 

So können wir verstehen, dass next() Wort für Wort zu lesen, damit es nicht \ n nicht verwendet wie nextLine()

+0

Danke, das löst tatsächlich mein Problem und es scheint, dass meine Frage bereits anderswo gefragt und beantwortet wurde. Es hinterlässt mir eine Frage: Warum ignoriert 'next()' das noch im Scanner verbliebene \ n? –

+0

@Dr.Hoenikker liest Wort für Wort, getrennt durch ein Leerzeichen, nicht wie nextLine() it use \ n Sie können mehr in meinem Beispiel verstehen –

+0

Ok, das macht Sinn, next() ignoriert Leerzeichen und Zeilenumbrüche alle gleich, und in meinem Beispiel ignoriert das \ n links von nextDouble() und wartet auf meine Eingabe! –

Verwandte Themen