[Java] ArrayOutOfBoundsException

ArrayOutOfBoundsException [Java] - Programmation

Marsh Posté le 20-03-2001 à 15:37:30    

Hello,
 
J'ai rarement vu une condition de boucle aussi biscornue que la tienne :-) C'est HORRIBLE !!!!!!
 
Essaie ca :-)
 
public void EffaceLogin (String login)  
{  
 int i = 0;  
 while (i < Tab.size())  
 {
  InfosFichiers I = (InfosFichiers)(e.getElementAt(i));  
  String s = I.RetourneLogin ();  
  if (s.compareTo (login) == 0)  
  {  
    Tab.removeElementAt (i);  
  }  
  else i++;  
 }  
}

Reply

Marsh Posté le 20-03-2001 à 15:37:30   

Reply

Marsh Posté le 20-03-2001 à 15:50:54    

darklord22 a écrit a écrit :

Hello,
 
J'ai rarement vu une condition de boucle aussi biscornue que la tienne :-) C'est HORRIBLE !!!!!!
 
Essaie ca :-)
 
public void EffaceLogin (String login)  
{  
 int i = 0;  
 while (i < Tab.size())  
 {
  InfosFichiers I = (InfosFichiers)(e.getElementAt(i));  
  String s = I.RetourneLogin ();  
  if (s.compareTo (login) == 0)  
  {  
    Tab.removeElementAt (i);  
  }  
  else i++;  
 }  
}




 
C'est un banquier, il est prudent :D

Reply

Marsh Posté le 20-03-2001 à 19:08:39    

Oui, j'ai rajouté les conditions dans la boucle pour mes nombreux tests mais ça ne change rien. La version initiale ne comportait que le (i < Tab.size ()) ;) J'ai toujours une Exception lorqu'il supprime un élément du Vector. En fait, je me demande si ça ne vient pas de Java lui même puisque cette erreur ne se produit que lorsque le nombre d'éléments du vecteur est assez élevé (plusieurs centaines).

Reply

Marsh Posté le 21-03-2001 à 03:47:25    

JBM a écrit a écrit :

Bonjour à tous,
 
J'ai une ArrayOutOfBoundsException lors de l'exécution de cette méthode :
 
public void EffaceLogin (String login)
 // efface tous les enregistrement pour un utilisateur (lorsqu'il se déconnecte)
 {
 
  int i = 0;
  while ((i >= 0) && (i < Tab.size ()) && (Tab.size () > 0))
  {
    InfosFichiers I = (InfosFichiers)(Tab.get(i));
    String s = I.RetourneLogin ();
    if (s.compareTo (login) == 0)
    {
     Tab.removeElementAt (i);
    }
    else i++;
  }
 }
 
Tab est un Vector.
 
J'ai beau chercher, je ne vois pas ce qui cloche. Ce type d'exception se produit lorsque l'on tente d'accéder à un élément en dehors du vecteur. De plus, la suppression d'un élément par RemoveElementAt est censée décaler tous les éléments suivants d'un cran vers la gauche.
 
Help !




 
L'algo a l'air bon, c'est clair. Le mieux dans ce genre de cas est de d'afficher les valeur de i et de Tab.Size() à chaque occurrence de la boucle. Tu sauras comme ça exactement à kel moment l'exception est lancée.

Reply

Marsh Posté le 21-03-2001 à 07:58:30    

Ben avec plusieurs milliers d'éléments dans mon vecteur, j'ai pas fini si j'affiche toutes les valeurs de i et Tab.size () ;)
 
En fait, même si je mets un if ((i>=0) && (i<Tab.size ())) juste avant le Tab.removeElementAt (i), il me sort quand même l'exception :??: Et même plusieurs exceptions à la suite parfois. De plus, il n'indique pas qu'elle se produit dans mon programme mais dans la méthode elementAt () de la classe Vector de Java :??:
Par contre, ça ne gêne en rien l'exécution du programme qui se poursuit normalement et ça supprime bien les éléments du vecteur que je veux supprimer.

Reply

Marsh Posté le 21-03-2001 à 20:10:19    

Si tu veux connaître les indices en question, tu peux écrire :
while (i < Tab.size () {
    try {
         // Ton corps de boucle
    }
    catch (ArrayOutOfBoundsException e) {
         System.out.println("Taille du vecteur = " + Tab.size() + ", indice courant = " + i);
         e.printStackTrace();
    }
}
 
Sinon, une question bête : tu utilises quel JDK et quelle machine virtuelle ? Et si tu remplaces Vector par ArrayList, rien ne change ? (les 2 classes sont dans le même package ; la seule différence entre les 2, c'est qu'ArrayList n'est pas synchronisée => plus efficace)

Reply

Marsh Posté le 21-03-2001 à 20:24:05    

JBM a écrit a écrit :

Par contre, ça ne gêne en rien l'exécution du programme qui se poursuit normalement et ça supprime bien les éléments du vecteur que je veux supprimer.




Par contre, ça c'est bizarre... Tu fais un catch (qui ignore l'exception) quelque part que tu ne nous aurait pas écrit ?
 
Parce que normalement, si tu ne fais de catch nulle part, une ArrayOutOfBoundsException devrait te stopper ton programme au moment où l'exception a lieu...

Reply

Marsh Posté le 21-03-2001 à 21:02:12    

BifaceMcLeOD a écrit a écrit :

Si tu veux connaître les indices en question, tu peux écrire :
while (i < Tab.size () {
    try {
         // Ton corps de boucle
    }
    catch (ArrayOutOfBoundsException e) {
         System.out.println("Taille du vecteur = " + Tab.size() + ", indice courant = " + i);
         e.printStackTrace();
    }
}
 
Sinon, une question bête : tu utilises quel JDK et quelle machine virtuelle ? Et si tu remplaces Vector par ArrayList, rien ne change ? (les 2 classes sont dans le même package ; la seule différence entre les 2, c'est qu'ArrayList n'est pas synchronisée => plus efficace)




 
Le plus étrange, c'est qu'un try ... catch sur une ArrayOutOfBoundsException dans ma boucle n'est pas pris en compte :??: Par contre, il suffit de mettre en commentaires le Tab.removeElementAt (i); pour ne plus avoir l'exception (mais le tableau ne se vide plus bien sûr) donc c'est bien là qu'est le problème.
 
J'utilise le JDK 1.3 et la machine virtuelle 1.3 (le tout sous Windows NT4 et 2000). En fait, il ne s'agit pas d'un vector mais plus précisément d'un DefaultListModel (que j'utilise dans une JList) mais dont les méthodes sont identiques à celles d'un Vector à quelques détails près.

Reply

Marsh Posté le 21-03-2001 à 21:04:56    

BifaceMcLeOD a écrit a écrit :

 
Par contre, ça c'est bizarre... Tu fais un catch (qui ignore l'exception) quelque part que tu ne nous aurait pas écrit ?
 
Parce que normalement, si tu ne fais de catch nulle part, une ArrayOutOfBoundsException devrait te stopper ton programme au moment où l'exception a lieu...




 
Je ne fais nulle part un catch sur cette exception et le programme continue bien son exécution sans erreur ! Et même en faisant un catch, il ne le prend pas en compte :??:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed