我一直在java.lang.IndexOutOfBoundsException: Index: 1288, Size: 1287
这是参考第一个for循环中的ArrayList<Formant> stored
。我不明白为什么ArrayList的容量设置为1287而不是dp.size
任何人都可以帮忙吗? 我已将最大堆大小增加到10Gb 我已经尝试将初始容量设置为2048(dp的最大大小)。 相关代码如下所示:
public Formant[] analyzeBuffer(ArrayList<DataPoint> dp) {
//declare variables
int count1 = 0;
int count2 = 0;
ArrayList<DataPoint> stored = new ArrayList<>(dp.size());
Formant[] buffForm = new Formant[12];
//f = new Formant(greatest);
//control for infinit loop
//while loop checks if datapoint is above threshhold, finds the largest number, and removes all datapoints within a given formant
while (!(dp.isEmpty())) {
//checks if data point is above threshold, if yes: stores data point in new arraylist
for (DataPoint td : dp) {
if (td.returnFreq() > threshold) {
stored.add(count1, td);
count1++;
}
//checks if data point is the largest number
if (td.returnFreq() > greatest) {
greatest = td.returnFreq();
f = new Formant(greatest);
}
}
//only removes data points that are formants
//removes all data points within a given formant
if (f.isFormant) {
buffForm[count2] = f;
count2++;
for (int k = 0; k < stored.size(); k++) {
if (stored.get(k).returnFreq() <= (f.determineFormant() + 150) && stored.get(k).returnFreq() >= (f.determineFormant() - 150)) {
stored.remove(k);
}
}
}
//if freqeuncy is not formant remove all instances of that data point
else{
buffForm[count2] = f;
count2++;
for (int k = 0; k < stored.size(); k++) {
if (stored.get(k).returnFreq() == f.freq) {
stored.remove(k);
}
}
}
}
return buffForm;
}
答案 0 :(得分:2)
ArrayList的容量与其大小不同。它的大小是&#34;其中有多少元素,&#34;而容量是&#34;在ArrayList必须重新调整其内部数组的大小之前,我可以放入多少个元素?&#34;
List#add(int idx, E element)
在给定索引处添加了一个元素,但它要求List的 size (不是容量)足够大:
[throws]
IndexOutOfBoundsException
- 如果索引超出范围(index < 0 || index > size())
答案 1 :(得分:1)
stored.remove(k);
您只是收缩stored
,因此较大的索引不再有效。
你需要让你的循环向后运行,这样你就不会尝试使用通过删除而移位的索引。