我正在尝试这样做,所以我可以将数据写入ArrayList以跟踪随机整数,然后我将有一个前一个按钮,它将返回到最后的结果(这只是测试该代码,这不是完整的代码对于项目)我在尝试获取int arraySize并将其减去1并重新打印数据时收到错误。知道为什么会发生这种情况或者如何完成任务的另一种方式。
int lenth = 10;
ArrayList<Integer> list = new ArrayList<Integer>();
int arraySize = list.size();
Random random = new Random();
int newRandom = random.nextInt(lenth);
list.add(newRandom);
newRandom = random.nextInt(lenth);
list.add(newRandom);
System.out.println(list.get(arraySize));
arraySize--;
System.out.println(list.get(arraySize));
这也是我得到的错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at test.C_MainActivity.main(C_MainActivity.java:22)
答案 0 :(得分:3)
当您将一个primitive(例如int
)分配给另一个时,会将该值复制到新变量。对于对象,这有点不同,因为这些变量将指向同一个对象。
int arraySize = list.size();
因此,上述行只会将arraySize
设置为列表的当前大小,arraySize
不会随着列表大小的变化而更改。由于您在列表为空时执行此操作,因此它将保持0
并且您将尝试获取索引0
和0-1 = -1
处的元素,这是您的例外情况进来了。
您应该在插入所有元素之后设置它。
请注意,Java中的索引从0开始,因此最后一个元素已经位于list.size() - 1
,而不是list.size()
。
答案 1 :(得分:0)
在将任何内容添加到列表之前,您正在设置arraySize。 arraySize的值始终为0,因为您只在开头设置它。当你调用arraySize--时,arraySize现在是-1,当你调用list.get(arraySize)时,你会得到索引超出范围的异常,因为你要求索引-1。
答案 2 :(得分:0)
您的目标似乎是将一个集合中的值排入队列,然后将它们出列。例如,LinkedList
更适合使用push()
和pop()
方法。
无论如何,你不应该通过外部变量跟踪ArrayList
的大小。已在ArrayList
内为您提供此类数据,因此您只需查询列表即可了解其大小。