2016-10-30 1 views
0

J'essaie d'utiliser la classe StringTokenizer pour séparer une chaîne de caractères d'un fichier texte, mais lorsque j'utilise l'application, le compilateur imprime dans la console Netbeans les mots que je divise mais aussi montre une exception.Java StringTokenizer Erreur

Ceci est mon code:

package Calqfunny; 

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.util.StringTokenizer; 
import javax.swing.JOptionPane; 

public class Files { 

public String direccion; 

public Files(){ 

    direccion = " "; 
} 

public Files(String direccion){ 

    this.direccion = direccion; 
} 




public String leerTxt(String direccion){ 

    String auxiliar = " "; 

    try{ 

     BufferedReader br = new BufferedReader(new FileReader(direccion)); 
     String temp = " "; //Aqui guardamos el texto del archivo temporalmente 
     String banana; //aqui almacenamos 


     while((banana = br.readLine())!=null){ 
      //se realiza el ciclo mientras que el archivo tenga datos. 

      temp = temp + banana; 

     } 
     auxiliar = temp; 

    }catch(Exception e){ 

    JOptionPane.showMessageDialog(null,"\"¿Cómo vas a pedir un archivo que no existe? boludo :v\""); 

    } 

    String nombre = null, apellido = null, edad = null, bday = null; 
    StringTokenizer tokens = new StringTokenizer (auxiliar, ";"); 

    System.out.println("Nombre\tApellido Edad\tFecha de Nac."); 
    while(tokens.hasMoreTokens()){ 


      nombre = tokens.nextToken(); 
      apellido = tokens.nextToken(); 
      edad = tokens.nextToken(); 
      bday = tokens.nextToken(); 


      System.out.println(nombre+"\t"+apellido+"\t"+edad+"\t"+bday); 

    } 

     return auxiliar; 
    } 
} 

Ceci est la sortie de mon application

Nombre Apellido Edad Fecha de Nac. 
David Villa  31  1985 
Andrea Pirlo  36  1980 
Lionel Messi  29  1987 
Tomas Rincon 27  1989 

Et ceci est l'exception que le compilateur jette

Exception in thread "main" java.util.NoSuchElementException 

at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 

at Calqfunny.Files.leerTxt(Files.java:69) 

at Calqfunny.Mein.main(Mein.java:14) 

C:\Documents and Settings\Goyo\Configuración local\Datos de  
programa\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned:1 

BUILD FAILED (total time: 0 seconds) 

Que puis-je faire pour le résoudre?

+0

Pouvez-vous fournir le contenu de votre fichier Direccion? – developer

+0

Comme javaguy a dit, le contenu du fichier serait la clé pour résoudre votre problème. En outre, cette erreur est due à votre boucle while while (tokens.hasMoreTokens()) '- hasMoreTokens() est généralement valide pour 1 jeton de plus, et vous en consommez 4 à la fois. –

+0

@javaguy pouvez-vous être plus précis? Je ne comprends pas. –

Répondre

0

Votre boucle while teste si le StringTokenizer a UN jeton de plus. Mais alors vous lisez QUATRE autres jetons. Cela va planter quand le nombre de jetons n'est pas divisible par quatre.

Ce que vous pouvez faire en toute sécurité est:

StringTokenizer tokens = new StringTokenizer(auxiliar, ";"); 

while(tokens.hasMoreTokens()){ 
    token = tokens.nextToken(); 
    System.out.println(token); 
} 
+0

alors, que puis-je faire? Comment vérifier les jetons dans ma boucle? –

+0

Vous devez d'abord vérifier l'existence du jeton suivant (vous l'avez fait correctement dans votre condition while), puis lire exactement un jeton dans la boucle while. – Steve

+0

Ok, dans ce cas, je devrais faire une boucle pour chaque jeton? –