我是Java的新手,这是一个初学者的问题。 我有一个学生对象数组。这些Student对象具有两个ArrayList属性:works和selectedWorks。 第一个代表该学生应在本年度学习的10份作品清单,第二个代表该学生将要研究的这10幅作品中的三份随机选择。 为了随机选择作品,我的主班有以下方法:
private void chooseWorks() {
/*
* For each student get student.works in a temporary ArrayList<String>,
* randomize works and set the student's selectedWorks property
*/
for (Student student:students) {
ArrayList<String> temp = new ArrayList<String>();
ArrayList<String> chosenWorks = new ArrayList<String>();
// Get a new temp array list and copy works in it
temp = student.getWorks();
// Find the first work in works 1-5
int min = 0;
int max = 4;
int i = ThreadLocalRandom.current().nextInt(min, max + 1);
chosenWorks.add(temp.get(i));
temp.remove(i);
// Then from 6 to 10
min = temp.size() - 5;
max = temp.size() - 1;
i = ThreadLocalRandom.current().nextInt(min, max + 1);
chosenWorks.add(temp.get(i));
temp.remove(i);
// Then anyhwere in what's left
min = 0;
max = temp.size() - 1;
i = ThreadLocalRandom.current().nextInt(min, max + 1);
chosenWorks.add(temp.get(i));
// Finally set students selected works
students.setSelectedWorks(chosenWorks);
} // end for student:students
}// end chooseWorks()
每次用户在GUI中按下“选择作品”按钮时,都会调用此方法。然后将每个学生选择的作品的结果随机选择呈现给用户。如果用户对呈现给他的那个按钮不满意,则用户可以再次按下该按钮以获得另一种组合。 在用户第四次按下按钮之前,它运行良好,这时出现以下运行时错误:
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index -2 out-of-bounds for length 3
at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
at java.base/java.util.Objects.checkIndex(Objects.java:372)
at java.base/java.util.ArrayList.get(ArrayList.java:440)
at com.FDVentures.LePion_0_3.chooseWorks(LePion_0_3.java:143) ##this line is the second chosenWorks.add(temp.get(i)); above
我想这与以下事实有关:循环中的ArrayList变量以一种或多种方式在学生之间持久存在。 我试图在循环结束时使它们的变量无效(temp = null; selectedWorks = null;),但是它不起作用。 我还试图将ArrayList构造函数放到循环之外,但是它也不起作用。
我猜这个问题与引用有关,无法进行垃圾回收,但是我似乎在Java手册中或网上都找不到任何有关它的信息。 欢迎任何想法!