简体   繁体   中英

ArrayList Index out of bounds but actually not?

So I am having a very confusing bug with my java code right now. I am just going to insert the important parts of my code, and explain what it should do:

 ArrayList<String> superstarKandidaten = new ArrayList<>(freundesliste.keySet()); //there are exactly 5 keys in freundesliste, and after checking the content of superstarKandidaten, it gives me 5 different values (everything how I wanted it to be)

Now, the following code looks a bit weird, its basically supposed to read two values of superstarKandidaten which aren't the same.

int i = 0;    
while (superstarKandidaten.size() > 1) {
                if (i + 1 > superstarKandidaten.size()) i = 0; else i++;
                System.out.println(i);
                person1 = superstarKandidaten.get(i);
                System.out.println(person1);
                if (i + 1 > superstarKandidaten.size()) i = 0; else i++;
                System.out.println(i);
                person2 = superstarKandidaten.get(i); // <-- this is where the error happens according to the error message. (this is Ausrechnen.java:24
                System.out.println(person2);
                if (person1.equals(person2)) {
                    if (i + 1 > superstarKandidaten.size()) {
                        i = 0;
                    }else i++;
                    person2 = superstarKandidaten.get(i);
                }

I am not going to write the rest of the code since it is unnecesarry, here is the output:

    {Knuth=null Turing Dijkstra, Hoare=null Turing Dijkstra Codd, Turing=Hoare Dijkstra, Codd=null Turing Dijkstra Knuth, Dijkstra=null} // this is freundesliste
[Knuth, Hoare, Turing, Codd, Dijkstra] //this is superstarKandidaten
1 //this is i
Hoare //this is person1
2 //this is i
Turing //this is person2
3
Dijkstra
4
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 4 out of bounds for length 4
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:458)
    at Ausrechnen.superstar(Ausrechnen.java:24)
    at Main.main(Main.java:22)

Whatever the actual size of your list is, this snippet contains a flaw:

 if (i + 1 > superstarKandidaten.size()) i = 0; else i++; System.out.println(i); person2 = superstarKandidaten.get(i); 

The if allows i to reach super....size() , while valid indices are in the range of 0 ... super...size()-1 .

eg i=3 , super...size()=4 , 3+1>4? No, i=4 . Then super...get(4) dies.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM