2017-10-04 3 views
-2

J'ai un problème avec mon application Java. L'application est nécessaire pour effectuer les opérations suivantes:Erreur dans l'application Java avec le scanner. Next() vs NextLine() et pourquoi je reçois une erreur?


(1) invite l'utilisateur à une chaîne qui contient deux chaînes séparées par une virgule. (1 pt)

Des exemples de chaînes qui peuvent être acceptés: Jill, Allen Jill, Allen Jill, Allen Ex:

Entrez chaîne d'entrée: Jill, Allen

(2) Rapport une erreur si la chaîne d'entrée ne contient pas de virgule. Continuez à demander jusqu'à ce qu'une chaîne valide soit entrée. Remarque: Si l'entrée contient une virgule, supposez que l'entrée contient également deux chaînes. (2 pts)

Ex:

Entrez chaîne d'entrée: Jill Allen Erreur: pas de virgule dans la chaîne Entrez chaîne d'entrée: Jill, Allen

(3) Extrait les deux mots de la chaîne d'entrée et supprimez tous les espaces. Stockez les chaînes dans deux variables distinctes et affichez les chaînes. (2 pts)

Ex:

Entrez chaîne d'entrée: Jill, Allen Le premier mot: Jill Deuxième mot: Allen

(4) En utilisant une boucle, étendre le programme à gérer plusieurs lignes de contribution. Continuez jusqu'à ce que l'utilisateur entre q pour quitter.(2 pts)

Ex:

Entrez chaîne d'entrée: Jill, Allen Le premier mot: Jill Deuxième mot: Allen

Entrez chaîne d'entrée: Golden Monkey Premier mot: Golden Deuxième mot : Singe

Entrez chaîne entrée: Washington, DC premier mot: Washington Deuxième mot: DC

Entrez chaîne entrée: q


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

L'erreur Im se retourne:

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 

Répondre

0

Scanner.next doc dit:

Throws: NoSuchElementException - if no more tokens are available

Raison de votre exception:

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. 

Alors ça marcherait si vous changez cette ligne:

lineString = scnr.next(); 

avec ceci:

lineString = scnr.nextLine(); 

Scanner.nextLine lira toute la ligne comme vous attendez. Quoi qu'il en soit, l'utilisateur peut entrer un mot. Donc ce serait bien de valider l'entrée avant de procéder. Vous pouvez le faire comme ceci:

lineString = scnr.nextLine(); 

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

Ici, j'utilise une expression régulière pour valider qu'il y a plus d'un mot dans l'entrée.

+0

@Adro S'il vous plaît lire: [? Que dois-je faire quand quelqu'un répond à ma question] (https://stackoverflow.com/help/someone-answers) –