因此,当我运行此方法时,我不断获取数组索引超出范围错误。我对此错误很熟悉,但我不明白为什么会出现这种错误。这是代码:
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)
的行。但是,如果你看上面,你可以看到我有完全相同的声明,但它不会产生错误。请帮忙!
答案 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