2010-11-19 16 views
2

Ich habe den folgenden Code in meinem Android-App:Warum passiert hier eine ArrayIndexOutOfBoundsException?

Event[] events = retrieveEvents(); 
if (events != null && events.length>0) { 
    int eventNr = getFromUserInput(); 
    eventNr = eventNr % events.length; 
    Event event = events[eventNr]; 
} 

retrieveEvents() einige Event s aus dem Internet bekommt, so kann dies ein zwar leer oder null sein scheitern. Der Benutzer kann wählen, welche Event angezeigt werden soll, um eine Ausnahme zu vermeiden Ich verwende die Modulo-Operation, um sicherzustellen, dass die eventNr innerhalb der Grenzen ist. Dies funktioniert auf allen Geräten, die ich getestet habe auf BUT:

Ich erhalte Fehlermeldungen von anderen Benutzern, wo die vorletzte Zeile (der Array-Zugriff) eine ArrayIndexOutOfBoundsException wirft. Wie kann das passieren? Welchen Zustand habe ich unkontrolliert? Wo ist mein Fehler?

Denken Sie daran: Die retrieveEvents() und die getFromUserInput() Funktion können beide ungültige Daten zurückgeben, aber ich denke, ich habe jeden Fall überprüft, also wo ist meine Schuld?

+0

Also * erhalten * Sie eine ArrayIndexOutOfBoundsException? Auf welcher Linie? das Ereignis Ereignis = Ereignisse [EreignisNr]; Zeile? – aioobe

+1

@aioobe: Ja, er sagte * "wo die zweitletzte Zeile (der Array-Zugriff) wirft ..." * –

+0

Was ist der Index in der Ausnahme? – starblue

Antwort

7

Haben Sie sichergestellt, dass eventNr niemals negativ ist? Der Scheck ist nicht in Ihrem Code enthalten. Das Problem ist, dass, wenn zum Beispiel eventNr-1 und events.length 5, -1 % 5 = -1 ist und natürlich events[-1] außerhalb der Grenzen ist.

+0

Nein, aber selbst wenn, wo wäre das Problem? – theomega

+0

@theomega: Wenn 'eventNr' ist, sagen wir,' -1' und 'events.length' ist' 5', '-1% 5 = -1' und' events [-1] 'ist außerhalb der Grenzen. –

+0

ein Index (eventNr) von -x (-5% 4 = -1) – teemitzitrone

2

Ist dies eine Anwendung mit Gewinde? Ist es möglich, dass retrieveEvents() immer einen Verweis auf dasselbe Array zurückgibt, das Array aber in Echtzeit geändert wird? Wenn ja, könnte das dein Problem sein.

+0

Dachte nie, obwohl die Anwendung nicht Threaded ist, könnte es ein Nebenläufigkeitsproblem sein, muss ich das untersuchen. – theomega

+0

Guter Punkt. Der ganze zitierte Code * sieht * wie lokale Vars aus, aber das könnte nur ein Code-Ding sein. Gute Frage zumindest. –