簡體   English   中英

for循環中超出范圍的異常打印小於Java中的arraylist大小

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

即使我在for循環中明確指定要打印到arraylist.size為止,終端也會返回OutOfBounds異常

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());
    }
}

這就是編譯器返回的結果:怎么可能? 我該如何解決?

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)

如果使用調試器,則應該看到playlist中的元素比songsadds元素多,因為它們是這些元素的總和(盡管不完全相同)。此錯誤是在運行時未編譯時產生的。

最簡單的解決方案是

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的大小小於其他兩個列表,則將成功。

Java中的ArrayList的索引從0開始。您正在訪問索引18,但是您的列表包含從0到17的元素。

由於您存儲了songsaddsplaylists ,因此您可以像這樣直接從playlist打印它們:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM