for循环中超出范围的异常打印小于Java中的arraylist大小

时间:2018-10-30 16:19:35

标签: java for-loop printing indexoutofboundsexception

即使我在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)

4 个答案:

答案 0 :(得分:0)

如果使用调试器,则应该看到#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; void reverseString(char arr[100]); char reversedInput[100]; int main() { char input[100]; cout<<"Please enter a string"<<endl; cin.getline(input, 100); cout<<"You entered "<<input<<endl; reverseString(input); cout<<"The reverse is "<<input<<endl; system("pause"); return 0; } void reverseString (char* arr) { size_t len = std::strlen(arr); for(size_t i=0;i<(size_t)(len/2);++i) { std::swap(arr[i], arr[len-i-1]); } } 的元素比playlistsongs多,因为这是这些元素的总和(尽管不完全是)。此错误是在运行时生成而不是编译时。

最简单的解决方案是

adds

或者只是

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

答案 1 :(得分:0)

我认为问题出在这里

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

答案 2 :(得分:0)

列表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的大小小于其他两个列表,则会成功。

答案 3 :(得分:-2)

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

由于将songsadds存储在playlists中,因此可以像这样直接从playlist打印它们:

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