2010-05-30 3 views
0

J'ai le code suivant dans une application:exception ArrayIndexOutOfBound même si je vérifie la longueur du tableau!

int lowRange=50; 
int[] ageRangeIndividual = {6, 10, 18, 25, 45, 65, 90}; 
int index=0; 
for (; index<ageRangeIndividual.length-1 && ageRangeIndividual[index]<=lowRange;index++); 

Je reçois une « Exception dans le thread « principal » java.lang.ArrayIndexOutOfBoundsException: 7 » dans la ligne pour! même si je spécifie explicitement de casser le cycle si index < dernier élément indexable dans le tableau!

Cela ne se produit pas toujours , mais après un certain temps de fonctionnement dudit programme (Lowrange varie chaque fois que la fonction est appelée)

Qu'est-ce que je ne vois pas?

+0

Vous lui dites en fait d'arrêter un élément avant la fin (le '-1' n'est pas nécessaire puisque vous utilisez' <'), mais cela ne devrait pas causer ce problème –

+4

Je ne vois aucune raison pour une exception ArrayIndexOutOfBoundsException dans votre extrait de code. Est-ce que le code est complet ou avez-vous oublié quelque chose? – oks16

+0

Montrez-nous le code, vous utilisez réellement! Le code actuel ne lance pas une exception 'ArrayIndexOutOfBoundsException' avec n'importe quelle valeur de' lowRange'. – ablaeul

Répondre

2

Le code que vous avez posté ne lance pas d'exception, seul. En fait, la vérification des limites de votre tableau est unique - vous êtes trop conservateur, à moins que vous n'ayez vraiment pas l'intention de vérifier la dernière valeur. Il serait normalement juste

index < ageRangeIndividual.length 

Vous dites que cela arrive à terme - avez-vous d'autres threads changeant la valeur de index ou ageRangeIndividual?

Je suppose que vous êtes sur le point d'utiliser index dans la ligne suivante - personnellement je trouverais plus clair si cela était enveloppé dans une méthode:

// Rename to something more appropriate, perhaps 
public static int findIndexOverMinimum(int[] values, int minimum) 
{ 
    for (int i = 0; i < values.length; i++) 
    { 
     if (values[i] > minimum) 
     { 
      return i; 
     } 
    } 
    return -1; // Or throw an exception, whichever is most appropriate 
} 

Je n'aime vraiment pas pour les boucles qui n'ont pas de corps et utilisent une variable existante pour l'indexation. Tout est parfaitement valide, mais cela ne va pas.

+0

Pour la dernière partie, c'est utile si vous vous cassez tôt dans la boucle et que vous voulez vérifier l'index pour voir si c'est le cas. C'est une grande raison pour laquelle j'aime la construction 'for/else' de python, elle élimine le besoin de la plupart de cela –

+0

@Michael: Je trouve que demander l'index plus tard est * habituellement * une indication que le refactoring le rendra plus simple. Pas toujours, mais habituellement. Ou je garde un "bestIndex" séparé ou quelque chose comme ça. La variable d'itération elle-même se sent "temporaire" en quelque sorte ... –

+0

Cette façon d'utiliser une structure itérative est une adaptation d'un algorithme de base souvent utilisé pour trouver une valeur dans une séquence. Si la variable temporaire contient "rien" cela signifie que la valeur n'a pas été trouvée. @Michael Mroze: Comme vous le savez probablement, la déclaration de retour dans la réponse de Jon agit comme une pause. –

0

Un ArrayIndexOutOfBoundsException apparaît lorsque vous faites référence à une valeur d'index de tableau qui dépasse sa valeur de longueur moins 1 (vous êtes en train de pêcher pour quelque chose qui n'est pas là).

Dans ce cas, l'index doit atteindre 7 suivi d'une tentative d'accès pour que cela se produise (dépasse 0-6). L'expression ageRangeIndividual.length-1 donnerait 6 (nombre d'éléments dans un tableau moins un) et l'expression index<ageRangeIndividual.length-1 devrait être évaluée à false. À son tour la deuxième expression après l'opérateur & & ne doit pas être évaluée et ne doit donc pas déclencher le Exception en premier lieu. La seule chose à laquelle je peux penser est si le code que vous testez est différent ou si index<ageRangeIndividual.length-1 est évalué comme prévu. Selon la priorité de l'opérateur (http://java.sun.com/docs/books/tutorial/java/nutsandbolts/operators.html), la soustraction doit être traitée en premier.

Questions connexes