Исключение из-за пределов печати в цикле меньше размера массива в Java - PullRequest
0 голосов
/ 30 октября 2018

, хотя я четко указываю в цикле 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 голосов
/ 30 октября 2018

Список 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 меньше, чем в двух других списках.

0 голосов
/ 30 октября 2018

Если вы используете отладчик, вы должны увидеть, что playlist имеет больше элементов, чем songs или adds, поскольку это сумма этих значений (хотя и не совсем). Эта ошибка возникает во время выполнения, а не во время компиляции .

Самое простое решение -

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);
}
0 голосов
/ 30 октября 2018

Я думаю, что проблема здесь:

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

lengthplaylist может быть больше, чем lengthsongs в вашем коде. И вы используете цикл для перехода от 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());
}
0 голосов
/ 30 октября 2018

ArrayList в Java индексируется с 0. Вы обращаетесь к индексу 18, однако ваш список содержит элементы от 0 до 17.

Поскольку вы храните ваши songs и adds в playlists, вы можете распечатать их прямо из playlist, например так:

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