2012-03-28 21 views
0

Diese Schleife ist seltsam.Java-Index-Array außerhalb der Grenzen Ausnahme

Ich habe dies in Java ausgeführt, gibt es eine Index außerhalb der Grenzen Ausnahme. Ich kann keine int l Erklärung irgendwo im Quellcode finden und ich kann nicht herausfinden, was es ist und fand heraus, dass es legal ist, dass es auf diese Weise erklärt wird.

Aber der Deal hier ist, ich verstehe nicht, was dieser Teil des Codes tut. Für jede Größe von resultSIList gibt es eine ArrayIndexOutOfBoundsException.

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

EDIT: Vielen Dank an Alle.

Hier ist ein lauffähiger Code, den ich benutze, um zu versuchen, diese ganze Schleife zu verstehen. Ja, es ist ein schreckliches Stück Müll.

public class IndexOutOfBoundsTest { 
    public static void main(String args[]){ 
     int offset = 50; 

     int maxItemsInOnePage = 50; 

     int totalSIs = 50; 

     final int buildThis = 15; 

     List resultSIList = new ArrayList(); 

     // build list 
     for(int zz = 0; zz < buildThis; zz ++){ 
      resultSIList.add("Hi " + zz); 
     } 

     try{ 
      for (int i = offset, 
        d = Math.min(i + maxItemsInOnePage, totalSIs); 
        i < d; i++){ 

       System.out.println(resultSIList.get(i)); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Ich habe ein Wort für Sie: Debugger. Gehen Sie durch und sehen Sie, wie das Verhalten Ihren Annahmen nicht entspricht. – duffymo

+1

Könnten Sie einen negativen Offset haben? –

+0

was ist die Größe von resultSIList –

Antwort

1

Es als , wenn und nur wenntotalSIs ist gleich oder kleiner als die Größe des resultSIList erwartet funktioniert. Überprüfen Sie diesen Wert. Hier ist ein funktionierendes Beispiel mit einigen zufälligen Werten:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8); 
int totalSIs = resultSIList.size(); 
int maxItemsInOnePage = 2; 
int offset = 1; 

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

Von Ihnen Code hinzugefügt Ich sehe, dass totalSIs ist größer (= 50), dann die Listengröße (= 15).

Sie könnten

totalSIs = resultsSIList.size(); 

direkt hinter der for-Schleife für eine schnelle Lösung hinzuzufügen.

+0

Hallo Andreas, ich denke, du hast Recht, hast du eine Idee, wenn das etwas wie ein Code-Fehler ist, oder es wirklich versucht, etwas zu tun? –

+0

Es kann etwas Sinnvolles in seinem Kontext tun - was ich nicht weiß. Der Code, den du gezeigt hast, ist eine ziemlich komplizierte Art, einen AIOOBE zu werfen;) –

0

Überprüfen Sie, ob offset kleiner als die Größe Ihrer Liste ist.

+1

Wenn Offset größer oder gleich ist (vermutlich, totalSIs), dann die 'für' Körper wird nicht laufen (wegen 'i

2

Dieser Code führt 'resulSIList' von 'offset' Position zum Minimum von 'offset + maxItemsInOnePage' und 'totalSIs'.

Wenn offset> 0 und totalSIs = resultSIList.size() Ich denke, dass es Ihnen keine Ausnahme außerhalb der Grenzen geben wird.

In Ihrem Beispiel haben Sie einen Offset von 50 und die Listengröße ist nur 15. Sie müssen überprüfen, ob Ihr Offset kleiner als die Listengröße ist.

1

ein paar mehr Infos bekommen Sie es mit einiger Protokollierung hinzugefügt laufen konnten:

System.out.println("offset: " + offset); 
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage); 
System.out.println("totalSIs: " + totalSIs); 
System.out.println("resultSIList.size(): " + resultSIList.size()); 
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    System.out.println("i: " + i); 
    resultSIList.get(i); 
} 

sollte dies auf Ihrem Problem etwas Licht läuft; Das letzte, das gedruckt wird, war außerhalb der Grenzen und durch die Analyse der vier ersten Ausdrucke sollten Sie Ihr Problem finden.

0

Sie sollten immer prüfen, ob Ihr Index i kleiner die Größe ist

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); 
     i < l && i < resultSIList.size(); 
     i++){ 
    resultSIList.get(i); 
} 
Verwandte Themen