意外的对象持久性导致IndexOutOfBounds

时间:2019-01-29 16:52:06

标签: java methods reference environment-variables indexoutofboundsexception

我是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手册中或网上都找不到任何有关它的信息。 欢迎任何想法!

0 个答案:

没有答案