ArrayIndexOutOfBoundsException

Davicito

Erfahrenes Mitglied
Hallo,

ich habe zu einem Array-Überlauf (ArrayIndexOutOfBoundsException), Probleme beim Abfangen und hoffe, das mir jemand helfen kann.

Java:
try{
    for(int i=0; i < tokens.length; i++){
        [...]
        // Schaut im Zeilen-Stream, ob das Key-Word "Telefon, Mobile, etc." vorkommt
        else if(tokens[i].matches("[Tt]el[\\.]?[:]?|[Tt]elefon[:]?|[Mm]obil[e]?[:]?|[Hh]andy[:]?") &&
                  tokens[i+1].matches("^(\\+|\\()?[\\+0-9-_/\\(\\)]+") && (i < tokens.length-1)){
                  [...]
                  //Eine Splitt-Funktion hat zuvor alle Nummern (getrennt durch Leerzeichen) gehakt und müssen
                  //nun wieder zu einer Nummer zusammengesetzt werden.
                  else if(tokens[i+1].length() < 6 && i < tokens.length-1){
                        int j=0; //Schaut auf das übernächste Token, ob eine Zahl vorhanden ist
                  
                        //prüfe hintereinander alle Tokens auf Nummerig
                        do{
                            j++;
                            telNr += tokens[i+j]; //Key-Word ist token[i]. Folge-Token ist Nummer token[i+1] (i+j)
                            [...]
                        //Prüfe, ob übernächstes Token token[i+2] (i+1+j) auch eine Nummer ist!             
                        }while(tokens[i+1+j].matches("[0-9-/]+") && (i+1+j) < tokens.length);
                       // Tokens werden abgearbeitet. Nach dem letzten Token-Element token.legth-1 wird die
                       // nächste Anweisung print nicht ausgeführt und die ArrayOutOfBoundsException gezeigt.
                       System.out.print("Nummernausgabe: "+telNr);                                      
          }
          [...]
   }
}catch(ArrayIndexOutOfBoundsException e){
            System.err.print("Das TokenArray wurde überschritten! "+e);
}

Meine fussgesteuerte Schleife (Zeile 20) arbeitet alle Tokens ab und überschreitet am Ende das Token-Array.
Alle meine Bemühungen, dass meine Schleife nicht über die Array-Grenze hinweg läuft, waren nicht von Erfolg gekrönt.

Ich habe statt (i+1+j) < tokens.length (Zeile 20) auch tokens[i+1+j] != null oder i-2 < tokens.length-1 versucht.
Selbst in meiner Verzweifelung habe ich !tokens.isEmpty() versucht. Aber nichts hilft an dieser Stelle.

Was mache ich falsch?

LG
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

die äußere Schleife läuft von i=0 bis 'tokens.length - 1' !
Also wird der Zugriff auf i+1 und erst Recht auf i+1+j natürlich zu der genannten Exception führen !

Mir ist auch nicht wirklich klar, was Du da genau versuchst !!

Gruß Klaus
 

Davicito

Erfahrenes Mitglied
Hi vfl_freak,

in dem oben abgebildeten Sub-Code ist ein sehr kleiner Ausschnitt zu sehen, eines riesigen Parsers, mit dessen Hilfe, Lebensläufe auf personenbezogene Daten untersucht und anschließend grafisch (in Tabellenform), alle Funde, aufgeführt werden.

Damit der Parser alle vorkommende Wörter (Key-Words: Tel. Email, Namen, Anschrift, etc. und den dazugehörigen, personenbezogenen Daten) analysieren kann, wurden alle vorkommenden Wörter zuvor gesplittet/getrennt (nach Leerzeichen, Komma, Tab-Zeichen \t und New-Lines \n und \r) in einem Token-Array tokens.
In der oben abgebildeten While-Schleife wird nun versucht eine Telefonnummer, die vom Bewerber nicht durchgehend (z.B. 10xx/xxxxxxxxx ) sondern in Blöcken getrennt durch Leerzeichen (z.B. 10xx / xx xx xx xxx) niedergeschrieben wurde - also durch die Splitt-Funktion zuvor zerhakt - wieder zusammen zufügen.

Dazu muss die While-Schleife auf das nächste Token-Element schauen, ob das nächste Token eine Nummer ist und kein Wort. Dazu lässt es sich nicht vermeiden, dass am Ende die Schleife ein Element gesucht wird, was nicht existiert.

Mittlerweile habe ich das Problem selber lösen können und den Code folgendermaßen vereinfacht/optimiert

Meine Lösung sieht nun folgendermaßen aus:
Java:
try{
   for(int i=0; i < tokens.length; i++){
        [...]
        else if(i+1 < tokens.length && tokens[i].matches("[Tt]el[\\.]?[:]?|[Tt]elefon[:]?|[Mm]obil[e]?[:]?|
                  Hh]andy[:]?") && tokens[i+1].matches("^(\\+|\\()?[\\+0-9-_/\\(\\)]+")){  
                  [...]
                  //Eine Splitt-Funktion hat zuvor alle Nummern (getrennt durch Leerzeichen) gehakt und müssen
                  //nun wieder zu einer Nummer zusammengesetzt werden.
                  else if(i < tokens.length && tokens[i+1].length() < 6){                           
                            //prüfe hintereinander alle Tokens auf Nummerig 
                            do{
                                i++;
                                telNr += tokens[i];                                
                            }while(tokens.length > (i+1) && tokens[i+1].matches("[0-9-/]+"));
                   } 
                   [...]                       
         }
         [...]
     }
}catch(ArrayIndexOutOfBoundsException e){
         System.err.print("Das TokenArray wurde überschritten! "+e)
}



Ich habe nur den Fehler gemacht, beim Abfangen des Array-Überlaufs, in der If- bzw. While-Bedingung (im Code unten, 6. Zeile) den Ausdruck an das Ende der Bedingung zu schreiben also:
Java:
// Auszug, nach altem Code!
[...]
do{
    [...]
}while(tokens[i+1+j].matches("[0-9-/]+") && (i+1+j)< tokens.length);
[...]


Ich vergaß, das der Interpreter die Bedingungen immer von links nach rechts ließt und sofort interpretiert.
Also würde der Compiler beim letzten Token-Element zuerst den Ausdruck: tokens[i+1].matches("[0-9-/]+") prüfen, und logischerweise sofort aussteigen und mir das ArrayIndexOutOfBoundsException zeigen, ohne den darauffolgenden Ausdruck: (i+1+j)< tokens.length Aufmerksamkeit zuschenken!

Ich danke Dir aber für Deine Hilfeleistung :)
LG.
 
Zuletzt bearbeitet: