数组索引超出界限错误Java

时间:2015-06-24 23:53:36

标签: java arrays

因此,当我运行此方法时,我不断获取数组索引超出范围错误。我对此错误很熟悉,但我不明白为什么会出现这种错误。这是代码:

public void setFrequencies() {

        List<Word> dupeWordList;
        dupeWordList = wordList;
        dupeWordList.removeAll(Collections.singleton(null));
        Collections.sort(dupeWordList);

        for(int i = 0; i < dupeWordList.size(); i++) {
            int count = 1;
            Word tempWord = dupeWordList.get(i);
            tempWord.setFrequency(count);
            Word nextWord = dupeWordList.get(dupeWordList.size() - 1);
            if(i+1 < dupeWordList.size() - 1) {
                nextWord = dupeWordList.get(i+1);
            }
            while(tempWord.getValue() == nextWord.getValue()) {
                count++;
                i++;
                tempWord.setFrequency(count);
                for(int e = 0; e < count - 1; e++) {
                    Word middleWord = new Word();
                    if((i-count+1)+1+e < dupeWordList.size() - 1) {
                        middleWord = dupeWordList.get((i-count+1)+1+e);
                    }
                    middleWord.setFrequency(count);
                }
                if(i+1 < dupeWordList.size() - 1) {
                    nextWord = dupeWordList.get(i+1);
                } else {
                    nextWord.setValue("the");
                }
            }
        }
        List<Word> reSortedList = wordList;
        Word fillWord = new Word();
        fillWord.setFrequency(0);
        fillWord.setValue(null);
        Collections.fill(reSortedList, fillWord);
        for(int i = 0; i < dupeWordList.size(); i++) {
            Word word = dupeWordList.get(i);
            int wordOrder = word.getOrigOrder();
            reSortedList.set(wordOrder, word);
        }

        setWordList(reSortedList);
    }

有问题的行是if语句中包含nextWord = dupeWordList.get(i+1)的行。但是,如果你看上面,你可以看到我有完全相同的声明,但它不会产生错误。请帮忙!

3 个答案:

答案 0 :(得分:0)

您正在为for循环行和while循环内部递增索引i。这对我来说听起来有点&#34;不 - 不#34;你知道你在那里做什么吗?我有一种直觉,你不应该这样做。

答案 1 :(得分:0)

我唯一能想到的是你遇到某种无限循环,你的条件是while(tempWord.getValue() == nextWord.getValue()) {。也许这两个值都会停留在"the"

如果发生这种情况,那么变量i将增加到超过Integer.MAX_VALUE并开始具有负值的点。

如果发生这种情况,那么条件if(i+1 < dupeWordList.size() - 1) {将成为现实,但i的值对于您的列表将无效,并将抛出超出范围的异常。

(顺便说一句,你真的应该使用equals()来比较字符串,而不是==

答案 2 :(得分:0)

我认为你指的是这段代码?

if(i+1 < dupeWordList.size() - 1) {
        nextWord = dupeWordList.get(i+1);
}

因此,dupeWordList.size()-1是您可以引用的最后一个索引位置。您引用的i+1小于最后一个索引(因为if语句条件)。所以,你试图get在最后一个词之前的一个词。

根据javadocs,您将获得IndexOutOfBoundsException if:

  

IndexOutOfBoundsException - 如果索引超出范围(索引&lt; 0 ||   index&gt; = size())

由于你的if语句保证索引不是&gt; = size(),所以唯一的可能性必须是索引&lt; 0