-1
votes

Avoir cette erreur de java.lang.arrayindexoutofboundsException qui m'arrête de continuer ma boucle itération

Je travaillais sur mon affectation et j'essaie de lire des données de mon fichier texte. Tandis que j'essayais de stocker ces informations à différents array un par un, une erreur comme celle-ci se produisait

mais avec la sortie de la console, elle montre qu'il a réellement exécuté à travers la première itération, mais elle se produit cette erreur et l'arrêtez-le

Ceci est mon code ci-dessous xxx

Ceci est ma sortie d'erreur dans ma console .... (remarques: 1L5 Jean Ceci ci-dessous provient de system.out.println (cucibleid [i] + "" + nom [i]); ) xxx


6 commentaires

Quel est le point du pour boucle? Pourquoi essayez-vous d'extraire 5 valeurs x fois? Re-pensez ce que vous faites, par exemple. La variable i doit incrémenter une fois pour chaque itération de l'extérieur pendant la boucle , et il ne devrait y avoir aucune boucle interne, car vous savez (bien, attendre) chaque ligne d'avoir 5 Valeurs, vous venez de les obtenir directement, comme dans cucibleid [i] = écarté [0]; , car le cucibleid est la première valeur de la ligne.


Très semblable à votre dernière question, celle-ci ne contient pas assez d'informations pour identifier le problème. Je peux faire une supposition éduquée, mais cela reste juste que: une supposition. Vous feriez mieux d'inclure le contenu du fichier jusqu'à la ligne après celui contenant le contenu john . (Mon devinement étant que ne pas réinitialiser j à 0 au début de chaque itération de la boucle vous permet d'essayer de faire référence à des parties de la scission qui n'existent pas (la 2e itération fait référence à la cinquième partie la première fois la première fois. Il y a un accès lu à la matrice).)


Oh yaa je pense avoir des problèmes logiques sérieux. Merci andreas


Merci fabian je pense que j'obtiens ce que tu veux dire


En fait, l'indice 5 est la 6ème partie ... a un peu d'inattention là-bas ...


Si vous avez un TSV (tabulation de valeur séparée) fichier, utilisez une API pour le traiter. Univocity.com/pages/about-parsers


4 Réponses :


-1
votes

Ajoutez un chèque avant d'accéder à l'index de tableau

  String[] splitted = readLine.split("\t");
 for(int i=0,j=0; i< splitted.length;i++) 
{ 
  if(splitted.length > j)
    cucibleID[i] = splitted[j++]; 
 if(splitted.length > j)
    name[i] = splitted[j++]; 
if(splitted.length > j)
    matricNo[i] = splitted[j++]; 
if(splitted.length > j)
    date[i] = splitted[j++]; 
if(splitted.length > j)
    spvName[i] = splitted[j++];     
  if(cucibleID.length >i && name.length >i)
  System.out.println(cucibleID[i] +" "+ name[i]);
 }


7 commentaires

Impossible d'utiliser Épôle dans pour en-tête de boucle si elle est déclarée à l'intérieur la boucle. En outre, quel est le point de fractionnement du même readline plusieurs fois?


J'ai essayé mais toujours mon pote de sortie .. mais merci de l'aide


Becaus La ligne dans le fichier texte est suivie d'ID, nom, matricno, date, SPVName avec un \ T comme Delimètre, c'est pourquoi je les divisions et enregistre dans le tableau individuellement. Ou y a-t-il un meilleur moyen?


Je suis sûr que cela supprime l'exception, mais cela n'entraîne pas le comportement NG Jing Xuan s'attend à. Cela semble une sorte de CSV (onglets) prenant le lieu de la commata dans ce cas.


Eh bien, le code source ne peut pas corriger si des problèmes avec des données d'entrée, il ne peut que gérer les problèmes gracieusement.


Que croyez-vous que l'entrée est? La question ne dit pas spécifiquement, bu la seule chose qui a du sens pour moi, ignorant la mauvaise logique du code de la question, est que le fichier est un fichier texte séparé par onglet, avec 5 valeurs par ligne. C'est pourquoi il y a une lecture de boucle lignes , et il y a 5 tableaux de 100 (?) Valeurs pour lire jusqu'à 100 lignes du fichier. L'index dans les 5 tableaux doit être un numéro de ligne, de sorte d'indexer avec i , qui itérale les valeurs d'une ligne, n'a aucun sens. Pourquoi chaque ligne commencerait-elle à affecter à [0] à chaque fois? La boucle pour est mauvaise, et cette réponse est donc.


Il y a une raison de croire en ce que, car l'indice de valeur de la valeur liée est de 5 en bûches d'exception, de sorte que s'il a traversé la limite de 100 lignes, il devrait avoir un index plus important.



0
votes

Votre code devrait être quelque chose comme ceci: xxx

modifié scanner à bufferedreader car scanner est très lent.


0 commentaires

0
votes

Permettez-moi d'expliquer, de quoi votre faute pour chaque boucle. En supposant que la longueur de votre réseau SClitett est 5.

première itération:

  • i = 0; j = 0;
  • ligne avec cucibleid -> i = 0; j = 0; et j ++ que signifie que J sera j = 1;
  • ligne avec nom -> i = 0; j = 1; et j ++ Cela signifie que J sera j = 2;
  • ligne avec matricno -> i = 0; j = 2; et j ++ qui signifie J sera j = 3;
  • ligne avec date -> i = 0; j = 3; et j ++ qui signifie que j sera j = 4;
  • ligne avec SPVName -> i = 0; j = 4; et j ++ qui signifie J sera j = 5;
  • fin de première itération. i = 0 -> i <7 -> i ++

    secondé itération

    • i = 1; j = 5;
    • ligne avec cucibleid -> i = 0; j = 5; et le arrayindexoutofbound arrivera

      Comme vous pouvez le voir de mon exemple est le suivant: Vous avez l'index correct i pour votre tableau écarté, mais vous utilisez j comme index. Le code suivant définira vos tableaux correctement à l'index 0, en supposant que votre matrice écartée a 5 éléments xxx


0 commentaires

0
votes

Vous n'avez pas besoin de la boucle. Utilisez j pour les éléments de l'enregistrement divisé. j devrait commencer à 0 pour chaque enregistrement. Utilisez i pour l'enregistrement traité.

Vous deviez probablement ajouter une certaine logique supplémentaire pour traiter l'enregistrement avec moins de 5 éléments xxx


1 commentaires

Je viens de prendre la liberté d'ajouter une déclaration de variable de déclaration pour j et de résoudre celui-ci pour i . Vous pouvez faire rouler la modification, si vous ne voulez pas retourner à votre version ...