-2

J'essaie d'implémenter dans mon programme que Scanner recherche dans un fichier texte jusqu'à ce qu'il trouve une ligne identique à la chaîne qu'il recherche. Je continue à obtenir l'erreur suivante:Exception dans le thread "principal" java.util.NoSuchElementException scanner Lors de la lecture d'un fichier texte

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:862) 
    at java.util.Scanner.next(Scanner.java:1371) 
    at hangman.HangmanArr.<init>(HangmanArr.java:62) 
    at hangman.HangmanApp.main(HangmanApp.java:18) 

le code pour le scanner est:

si (ans.equals ("A")) { nom d'utilisateur = JOptionPane.showInputDialog (null, « Entrez usesrname : "," Login 1/2 ", JOptionPane.QUESTION_MESSAGE);

try { 
     Scanner scFile = new Scanner(new File("TextFileB.txt")); 

     String line = scFile.nextLine(); 
     int flse = 0; 
     String user = " "; 

     while (scFile.hasNext() || flse == 0) { 
      line = scFile.nextLine(); 
      Scanner scLine = new Scanner(line).useDelimiter("#"); 
      user = scFile.next(); 
      if (user.equals(username)) { 
       password = JOptionPane.showInputDialog(null, "Welcome " + username + ". \n Please enter your password to play", "Login 2/2", JOptionPane.QUESTION_MESSAGE); 
       flse++; 

      } 

     } 
     scFile.close(); 

    } catch (IOException i) { 
     System.out.println("Text File could not be found"); 
    } 
} 

et le code complet pour la classe est:

package hangman; 

import java.io.*; 
import javax.swing.*; 
import java.util.*; 

/** 
* 
* @author ghost 
*/ 
public class HangmanArr { 

    String letter; 
    int x = 0; 
    String word; 
    String dashWord; 
    String newWord; 
    String username; 
    String password; 
    private Hangman[] arrUsers = new Hangman[100]; 

    public HangmanArr() { 
     JOptionPane.showInputDialog(null, "The aim of Hangman is to form " 
       + "a word \nby guessing individual letters \nof the word " 
       + "before a" 
       + " hanging man \nand gallows are built. Every letter\n " 
       + "that is entered " 
       + "which does not \nappear in the word will contribute to " 
       + "\nthe hanging" 
       + " man and gallows; by adding \na single component to " 
       + "drawing – \nif the hanging " 
       + "man and gallows are \ncomplete before guessing the " 
       + "complete word;\n you have lost " 
       + "the game. Goodluck!" + "\nPress Enter to continue", "H_NGM_N", JOptionPane.INFORMATION_MESSAGE); 
     String ans = " "; 

     ans = JOptionPane.showInputDialog(null, "Please enter an option of " 
       + "your choice\n" 
       + "A – login\n" 
       + "B - Sign up\n" 
       + "C - Scoreboard\n" 
       + "D - quit", "Menu A", JOptionPane.QUESTION_MESSAGE).toUpperCase(); 

     if (ans.equals("A")) { 
      username = JOptionPane.showInputDialog(null, "Enter usesrname:", "Login 1/2", JOptionPane.QUESTION_MESSAGE); 

      try { 
       Scanner scFile = new Scanner(new File("TextFileB.txt")); 

       String line = scFile.nextLine(); 
       int flse = 0; 
       String user = " "; 

       while (scFile.hasNext() || flse == 0) { 
        line = scFile.nextLine(); 
        Scanner scLine = new Scanner(line).useDelimiter("#"); 
        user = scFile.next(); 
        if (user.equals(username)) { 
         password = JOptionPane.showInputDialog(null, "Welcome " + username + ". \n Please enter your password to play", "Login 2/2", JOptionPane.QUESTION_MESSAGE); 
         flse++; 

        } 

       } 
       scFile.close(); 

      } catch (IOException i) { 
       System.out.println("Text File could not be found"); 
      } 
     } 


     if (ans.equals("B")) { 
      username = JOptionPane.showInputDialog(null, "Enter usesrname:", "Sign Up 1/2", JOptionPane.QUESTION_MESSAGE); 
      password = JOptionPane.showInputDialog(null, "Welcome " + username + ". \n Please enter your password to play", "Sign Up 2/2", JOptionPane.QUESTION_MESSAGE); 
      File add = new File("TextFileB.txt"); 
      try { 
       PrintWriter fw = new PrintWriter(new FileWriter(add, true)); 
       fw.write(username + "#" + password + "#"); 
       fw.println(); 
       fw.close(); 
      } catch (IOException e) { 
       System.out.println("Could not locate text file to store data"); 
      } 
     } 
    } 
} 
+1

Voulez-vous dire 'user = scFile.next()' 'être utilisateur = scLine.next()'? En ce moment je ne vois pas où vous l'utilisez et si vous appelez 'scFile.next' deux fois sans vérifier chaque fois que vous pouvez rencontrer une erreur d'E/S. –

+0

quel serait le code à vérifier? Voici mon code modifié: –

+0

Pouvez-vous remplacer 'user = scLine.next()' et voir si cela fonctionne? –

Répondre

0

Vous avez un problème dans votre état while.

Si vous atteignez la fin du fichier sans trouver le nom d'utilisateur, la valeur de flse sera toujours 0, de sorte que la condition de la boucle sera évaluée true, ce qui signifie que vous atteindrez l'appel scFile.nextLine() qui se traduira par un NoSuchElementException parce que vous avez atteint la fin du fichier.

Vous devez changer cette condition d'être:

scFile.hasNext() && flse == 0