即使我在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)
答案 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]);
}
}
的元素比playlist
或songs
多,因为这是这些元素的总和(尽管不完全是)。此错误是在运行时生成而不是编译时。
最简单的解决方案是
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的元素。
由于将songs
和adds
存储在playlists
中,因此可以像这样直接从playlist
打印它们:
for (int i = 0; i < lengthplaylist; i++) {
System.out.println(playlist.get(i).toString());
}