Verdammte IndexOutOfBoundException...

BZZZ

Mitglied
hi,

ich will vpno bwin die mannschaften und quoten auslesen udn in einer arraylist speichern... kriege aber, wenn ich die heimmmannschaften (also i%3==0) in den array tun will immer eine IndexoutOfBoundException.... hier mal mein codeausschnitt....
Java:
public void initialize(URL location, ResourceBundle resources) {
    ObservableList<String> olLiga = FXCollections.observableArrayList();
    ObservableList<String> olMatches = FXCollections.observableArrayList();

    ArrayList<String> heim = new ArrayList<>();
    ArrayList<String> auswarts = new ArrayList<>();
    ArrayList<String> heimOdd = new ArrayList<>();
    ArrayList<String> auswartsOdd = new ArrayList<>();
    ArrayList<String> xOdd = new ArrayList<>();

    olLiga.add("Bundesliga");
    selLiga.setItems(olLiga);



    try {
        Document doc = Jsoup.connect("https://sports.bwin.com/de/sports/4/43/wetten/bundesliga#leagueIds=43&sportId=4").get();

        Elements matches = doc.select("span.option-name");
        Elements odds = doc.select("span.odds");


        for(int i = 0; i < matches.size(); i++){
            if(i%3==0) {
                heim.add(i, matches.get(i).text());
            }
        }

        for(int i = 0; i < matches.size(); i++) {
            System.out.println(heim.get(i));
        }
....

hier die Exception:

"C:\Program Files\Java\jdk1.8.0_60\bin\java" -Didea.launcher.port=7542 "-Didea.launcher.bin.path=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 15.0.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_60\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\access-bridge.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_60\jre\lib\ext\zipfs.jar;C:\Users\Günay\IdeaProjects\jW\out\production\jW;C:\Users\Günay\Downloads\jsoup-1.8.3.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 15.0.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain sample.Main
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException:
/C:/Users/G%c3%bcnay/IdeaProjects/jW/out/production/jW/sample/sample.fxml

at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2601)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2579)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3214)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3175)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3148)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3124)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3104)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3097)
at sample.Main.start(Main.java:13)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$163(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$149(WinApplication.java:191)
... 1 more
Caused by: java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:661)
at java.util.ArrayList.add(ArrayList.java:473)
at sample.Controller.initialize(Controller.java:50)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
... 17 more

Helft mir mal bitte :/
 

X5-599

Top Contributor
Es liegt einfach daran, dass du die ArrayList mit Objekten füllst und denen sagst an welchen Index sie geschrieben werden sollen. Der Index darf aber nie größer sein als die aktuelle Listen Größe.
Code:
if(i%3==0) {
  heim.add(i, matches.get(i).text());
}

Der erste Durchlauf wird erfolgreich sein. Die Liste ist 0 Einträge groß und es soll das Objekt an Index 0 geschrieben werden.
Der nächste Durchlauf wird bei i==3 sein. Also wird versucht das Objekt an den Index 3 zu schreiben. Das funktioniert aber nicht, da die Liste zu diesem Zeitpunkt lediglich die Größe 1 hat.
 

BZZZ

Mitglied
mhhh ok also ich verstehe das problem, aber das heißt mein ansatz mit dem i%3 ist falsch um an jede 3. Stelle zu kommen...
jemand nen vorschlag dafür?
 

BZZZ

Mitglied
wobei, nein.
Ich sage ya nur ich möchte, wenn der Modulo = 0 ist, DIESEN eintrag an der stelle i, also an der nächsten Stelle haben oder?
 

Joose

Top Contributor
Aber du nimmst nur jeden 3.Eintrag.
Sprich immer wen du etwas einträgst in die Liste ist "i" um 3 größer.

Beispiel:
i = 3; i % 3 == 0
du trägst was ein an stelle 3, deine aktuelle listengröße = 0 => Exception

Du brauchst einfach eine 2.Zählervariable welche du eben nur erhöhst innerhalb vom if
 

X5-599

Top Contributor
Du bekommst jeden dritten Eintrag der "matches" liste. Dein Code sagt aber: Du willst den aber auch quasi an dieselbe Stelle in deiner "heim" liste speichern.
Wenn du einfach nur jeden dritten Eintrag haben möchtest und diese an die "heim" liste anfügen willst, musst du die Index Angabe beim heim.add() weglassen:

Code:
if(i%3==0) {
  heim.add(matches.get(i).text());
}
 

BZZZ

Mitglied
Java:
 for(int i = 0; i < matches.size(); i++){
                if(i%3==0) {
                    heim.add(matches.get(i).text());
                }
            }
der fehlerhafte code
 

BZZZ

Mitglied
naja ich habs nichts verändert sonst^^
bzw jetzt wird alles korrekt ausgelesen, aber wenn die schleife durch ist kriege ich die out of bound exception wieder :/
 

X5-599

Top Contributor
Ich vermute mal es liegt hier dran:

Code:
for(int i = 0; i < matches.size(); i++) {
  System.out.println(heim.get(i));
}

Natürlich nur, wenn dieser Code noch vorhanden ist. Hier wird versucht mit die heim List mit den selben Indeces der matches List anzusprechen. Nur hast du ja in die heim List nur jedes dritte Element aufgenommen. Also ist die heim List kleiner als die matches List. Lange Rede kurzer Sinn: Du darfst nur die tatsächlich vorhandenen Indeces der heim List verwenden, um diese anzusprechen.

Code:
for(int i = 0; i < heim.size(); i++) {
  System.out.println(heim.get(i));
}
 
Zuletzt bearbeitet:

Joose

Top Contributor
ohne indexabgabe kriege ich
Caused by: java.lang.IndexOutOfBoundsException: Index: 27, Size: 27
Sicher, dass der genannte Fehler in diesem Codeabschnitt auftritt?

Wenn eine Exception fliegt wird für gewöhnlich auch ein StackTrace ausgegeben. Bei diesem stehen sollte man dann in fast allen Fällen genau ablesen können in welcher Klasse und welcher Zeile die Exception geflogen ist.
Bitte diese Informationen immer mitposten inkl den Hinweis um welche Zeile es sich denn handelt (da man selten den vollständigen Code postet und dann die Zeilen natürlich nicht passen).
Mit dieser Informationen wäre dir der Fehler sicher selber auch aufgefallen ;)
 

Neue Themen


Oben