在 java 中,for 循环中的越界异常打印小于 arraylist 大小

Out of bounds exception printing in for loop less than arraylist size in java

即使我在 for 循环中明确指定我希望它打印到 arraylist.size,终端 returns 一个 OutOfBounds Exception

public static void PrintPlayList() {
        int lengthsongs = songs.size();
        int lengthadds = adds.size();
        int amountadds = 0;

    for (int i = 0; i < lengthsongs; i++) {
        playlist.add(songs.get(i));
        if (amountadds < lengthadds) {
            playlist.add(adds.get(amountadds));
            amountadds++;
        }
    }

    int lengthplaylist = playlist.size();
    for (int i = 0; i < lengthplaylist; i++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(i).toString());
    }
}

And this is what the compiler returns: How is it possible? How can I fix it?

java.lang.IndexOutOfBoundsException: Index: 18, Size: 18
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Main.PrintPlayList(Main.java:153)
    at Main.Interface(Main.java:55)
    at Main.main(Main.java:34)

Java 中的 ArrayList 从 0 开始索引。您正在访问索引 18,但是您的列表包含从 0 到 17 的元素。

由于您将 songsadds 存储在 playlists 中,您可以直接从 playlist 打印它们,如下所示:

for (int i = 0; i < lengthplaylist; i++) {
    System.out.println(playlist.get(i).toString());
}

如果你使用调试器,你应该看到 playlistsongsadds 有更多的元素,因为它是这些元素的总和(尽管不完全)错误是在运行时而不是编译时产生的。

最简单的解决方案是

public static void printPlayList() {
    playlist.clear();
    playlist.addAll(songs);
    playlist.addAll(adds);
    playlist.forEach(System.out::println);
}

或者只是

public static void printPlayList() {
    songs.forEach(System.out::println);
    adds.forEach(System.out::println);
}

我认为问题出在这里:

for (int i = 0; i < lengthplaylist; i++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(i).toString());
    }

lengthplaylist 可以比代码中的 lengthsongs 大。并且您正在使用 for 循环从 0 到 lengthplaylist 而不是 lengthsongs

您还应该注意 adds.get(i).toString() 因为要执行此操作,所有长度必须相同。

您可以像这样在循环中使用不同的变量:

for (int i = 0,j=0; i < lengthsongs && j<lengthadds; i++,j++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(j).toString());
}

列表 playlist 未在 PrintPlayList() 中初始化,因此它可能包含之前的元素。
在这个循环中:

for (int i = 0; i < lengthsongs; i++) {
    playlist.add(songs.get(i));
    if (amountadds < lengthadds) {
        playlist.add(adds.get(amountadds));
        amountadds++;
    }
}

您将 songs 的所有元素都添加到 playlist,因此 playlist 至少具有与 songs 一样多的元素,但它包含更多元素吗?我不知道,但您可以通过调试找出答案。
同样适用于列表adds
它们的尺寸都一样吗?这个循环:

for (int i = 0; i < lengthplaylist; i++) {
    System.out.println(songs.get(i).toString());
    System.out.println(adds.get(i).toString());
}

如果它们确实具有相同的大小或 playlist 的大小小于其他 2 个列表,则会成功。