2017-10-04 2 views
-2

Ich habe ein Problem mit meiner Java-Anwendung. Die Anwendung erforderlich, um die folgenden Funktionen ausführen:Fehler in Java-App mit Scanner. Next() vs NextLine() und warum bekomme ich einen Fehler?


(1) fordert den Benutzer für eine Zeichenfolge, die durch ein Komma getrennt zwei Strings enthält. (1 pt)

Beispiele für Strings, die akzeptiert werden können: Jill, All Jill, All Jill, Alle Ex:

Eingabezeichenfolge eingeben: Jill, All

(2) Bericht ein Fehler, wenn die Eingabezeichenfolge kein Komma enthält. Setzen Sie fort, bis ein gültiger String eingegeben wird. Hinweis: Wenn die Eingabe ein Komma enthält, wird davon ausgegangen, dass die Eingabe auch zwei Zeichenfolgen enthält. (2 Punkte)

Ex:

eingeben Eingabestring: Jill Aller Fehler: kein Komma in string Eingabestring eingeben: Jill, All

(3) Entpacken Sie die beiden Worte aus dem Eingabestring und entfernen Sie alle Leerzeichen. Speichern Sie die Zeichenfolgen in zwei separaten Variablen und geben Sie die Zeichenfolgen aus. (2 pts)

Ex:

eingeben Eingabestring: Jill, Alle Erstes Wort: Jill Zweites Wort: All

(4) eine Schleife erstrecken, um das Programm auf mehrere Zeilen Griff Eingang. Fahren Sie fort, bis der Benutzer q zum Beenden eingibt.(2 Punkte)

Ex:

Eingabezeichenfolge eingeben: Jill, Alle Erstes Wort: Jill Zweites Wort: All

Eingabezeichenfolge eingeben: Golden, Affe Erstes Wort: Goldenes Zweites Wort : Affe

Geben Sie Eingabestring: Washington, DC Erstes Wort: Washington Zweites Wort: DC

eingeben Eingabestring: q


Mein Code:

package parsestrings; 

import java.util.Scanner; 

public class ParseStrings { 

    public static void main(String[] args) { 
     Scanner scnr = new Scanner(System.in); // Input stream for standard input 
     Scanner inSS = null;     // Input string stream 
     String lineString = "";    // Holds line of text 
     String firstWord = "";     // First name 
     String secondWord = "";     // Last name 
     boolean inputDone = false;    // Flag to indicate next iteration 

     // Prompt user for input 
     System.out.println("Enter input string: "); 

     // Grab data as long as "Exit" is not entered 
     while (!inputDone) { 

      // Entire line into lineString 
      lineString = scnr.next(); 

      // Create new input string stream 
      inSS = new Scanner(lineString); 

      // Now process the line 
      firstWord = inSS.next(); 

      // Output parsed values 
      if (firstWord.equals("q")) { 
       System.out.println("Exiting."); 

       inputDone = true; 

       if (firstWord.matches("[a-zA-Z]+,[a-zA-Z]+")) { 
        System.out.print("Input not two comma separated words"); 
       } 
      } else { 
       secondWord = inSS.next(); 

       System.out.println("First word: " + firstWord); 
       System.out.println("Second word: " + secondWord); 

       System.out.println(); 
      } 
     } 
     return; 
    } 
} 

Der Fehler Im zurück bekommen:

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:862) 
    at java.util.Scanner.next(Scanner.java:1371) 
    at parsestrings.ParseStrings.main(ParseStrings.java:53) 
Java Result: 1 

Antwort

0

Scanner.next doc sagt:

Throws: NoSuchElementException - if no more tokens are available

Grund für Ihre Ausnahme:

lineString = scnr.next(); // this is reading just one word (token) 
//... 
inSS = new Scanner(lineString); // this creates a new scanner with a string consisting in just one word 
firstWord = inSS.next(); // this reads the word loaded in the inSS scanner 
//... 
secondWord = inSS.next(); // here is the problem. There are no more words left in this scanner (tokens) and throws the exception. 

So würde es funktionieren, wenn Sie diese Zeile:

lineString = scnr.next(); 

mit diesem:

lineString = scnr.nextLine(); 

Scanner.nextLine wird die gesamte Zeile lesen, wie du erwartest. Jedenfalls kann der Benutzer ein Wort eingeben. Es wäre also schön, die Eingabe vor dem Fortfahren zu validieren. Sie können es so tun:

lineString = scnr.nextLine(); 

if(lineString == null || lineString.length() == 0 || lineString.split("\\s+").length < 2){ 
    System.out.println("2 words required. Try again:"); 
    continue; 
} 

Hier verwende ich einen regulären Ausdruck, um zu validieren, dass es mehr als ein Wort in der Eingabe gibt.

+0

@Adro Bitte lesen Sie: [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Https://stackoverflow.com/help/someone-answers) –

Verwandte Themen