2017-03-22 2 views
0
for(int i=0; i<= field.length; i++){ 
    String[] field = allFields.split(","); 
    String field1 = "$"+field[i]; 
    BsonField includeFields = Accumulators.first(field[i], field1); 
    includeList.add(includeFields); 
} 
    group = Aggregates.group(groupByField,includeList); 

wo die allFields die Spalten haben, die ich auswählen möchte ("ID, NAME").indexoutofboundexception in Mongodb java

warum gibt es mir indexoutofboundexception?

+0

Sicherstellen, dass der Wert im Feld [i] die Länge des Felds – radhakrishnan

+0

nicht überschreitet, wenn ich includeFields 'name = 'ID', Wert = Ausdruck {Name = '$ first', Ausdruck = $ ID}' drucke. Ist die Ausnahme wegen dieser @radhakrishnan – svm

+0

Wo ist 'i' definiert? – Veeram

Antwort

0

Nur eine Referenz für zukünftige Besucher Angenommen, wir haben ein Array namens foo, die 10 Elemente enthält. Was passiert, wenn wir versuchen, geschieht iterieren den folgenden Code verwenden ?:

for(int i = 0;i<=foo.length;i++){ 
    //some code that uses foo[i] here 
} 

Die Antwort ist ein IndexOutOfBoundsException Der Grund simple.As ist, sagte vor foo 10 Elemente enthält, das heißt, dass Sie sie foo[0] to foo[9] zugreifen können Seit Array Indizierung beginnt von 0 foo[9] enthält das letzte Element in Ihrem Array (das 10. Element) `

Was passiert jedoch in der for Schleife?

Während Sie iterieren, überprüfen Sie immer i<=foo.length, um fortzufahren. Das Problem ist, dass, wenn der Wert i 9 ist der Ausdruck i<=foo.length(which means i<=10) ergibt true. Das bedeutet, dass die for Schleife für ein letztes Mal ausgeführt wird. Wenn dies in Ihrer Schleife passiert, versuchen Sie auf foo[10] zugreifen, die nicht vorhanden ist und daher IndexOutOfBoundsException

Also denken Sie daran, dass, wenn Sie ein Array Sie

Verwendung i<foo.length

immer iterieren so wie Sie es auch gedacht, die Lösung für Ihr Problem heraus ist dies:

for(int i=0; i< field.length; i++){ 
    String[] field = allFields.split(","); 
    String field1 = "$"+field[i]; 
    BsonField includeFields = Accumulators.first(field[i], field1); 
    includeList.add(includeFields); 
}