2

我创建了一个名为的自定义类Song,其中包含 3 个String变量、一个int变量和一个ArrayList项目String

现在我对所有变量都有正确的getter和setter等,但是问题是,当我为ArrayList变量分配一些东西并稍后尝试访问它时,它会抛出一个IndexOutOfBounds错误,因为它的大小是0。下面是有问题的代码。

是否有可能我没有正确分配变量,或者它的内存位置可能受到清除它的影响?

重要提示:我能够访问和打印其他变量的值,但该ArrayList变量是唯一失败的变量。


SongClass.java

@Parcel
public class SongClass {
    //Other variables defined here
    ArrayList <String> verses;

    public Song() { /*Required empty bean constructor*/ }

    public Song(String var1, String var2, String var3, int var4, ArrayList<String> verses) 
    {
        this.var1= var1;
        this.var2= var2;
        this.var3= var3;
        this.var4= var4;
        this.verses = verses;
    }

    //Getters and Setters below

SongReader.java

//Use to store a collection of Song objects (multiple songs)
private ArrayList<Song> songs = new ArrayList<>(10);

//This array will be assigned to the Song object -> verses
private ArrayList<String> verses = new ArrayList<>(10); 
//Other vars to be assigned to song object (String, String, String, int)

...

songs.add(new Song(String var1, String var2, String var3, int var4, verses);

//Important note: I clear the verses `ArrayList` after assigning it to songs. Could this possibly erase it from songs?
verses.clear();

SongDisplay.java

ArrayList<Songs> songs = Parcels.unwrap(intent.getParcelableExtra("Extras"));

...

for (int i = 1; i <= songs.get(0).size(); ++i)
{
    TextView textView = new TextView(this);
    ...
    //Error is thrown here
    textView.setText(songs.get(0).getVerses().get(i-1);
    ...
 }
4

5 回答 5

2

你的评论是正确的。因为ArrayList你传递给歌曲和ArrayList你调用clear()的是同一个对象,所以它们都被清除了。

如果您需要清除将ArrayListnew 传递ArrayListSong复制verses.

songs.add(new Song(String var1, String var2, String var3, int var4, new ArrayList(verses));

另外,请注意 java 中的数组和列表从索引 0 开始,因此您也应该修复 for 循环。

// hard coding songs.get(0) could lead to issues as well but at least fix the index i
for (int i = 0; i < songs.get(0).size(); i++)
{
    TextView textView = new TextView(this);
    ...
    //Error is thrown here
    textView.setText(songs.get(0).getVerses().get(i);
    ...
 }
于 2016-04-11T17:12:29.190 回答
1

因为您声明的versesArrayList 在您声明时为空

private ArrayList<String> verses = new ArrayList<>(10); 

通过new ArrayList<>(10);您不是创建一个包含 10 个元素的新 ArrayList,而不仅仅是定义一个初始容量。所以你verses是空的,verses.size()是 0。

即使你不打电话verses.clear();仍然是空的。

另一个说明清楚的例子

List<String> list = new ArrayList<String>(10);
System.out.println(list.size());// print '0'
list.add("A");
System.out.println(list.size());// print '1'
list.clear();
System.out.println(list.size());// print '0'
于 2016-04-11T17:19:19.047 回答
1

问题是您在 ArrayList 参考中调用 clear 。当您调用 song.add 并将诗句传递给它并清除它时,您正在清理参考。

您必须实例化您传递给 song.add 的数组,如下所示:

ArrayList<String> auxVerses = new ArrayList<>(verses);

songs.add(new Song(String var1, String var2, String var3, int var4, auxVerses);
于 2016-04-11T17:15:34.097 回答
0
verses.clear();  

由于这行代码,您得到的数组列表大小为 0。

于 2016-04-11T17:16:02.603 回答
0

请记住,调用private ArrayList<String> verses = new ArrayList<>(10);不会创建具有 10 个新“空”项的 ArrayList。它只是设置列表的最大容量。因此,如果您尝试访问任何项目,您将不会得到空值或任何类型的空值,因为您实际上并没有在列表中添加任何内容。您刚刚确保它为 10 个项目预留了内存。因此,调用ArrayList.size()此列表将正确地报告零项。

于 2016-04-11T17:16:10.747 回答