第一个例子
int windowStart = 0;
for (int i = 0; i + windowSize < fileArray.size(); i++) {
ArrayList <Character> window = new ArrayList <Character> ();
for (int s = windowStart; s <= windowStart + windowSize; s++) {
window.add(fileArray.get(s));
}
windowStart++;
}
VS
第二个例子
int ind = 0;
for (int i = 0; i + windowSize < fileArray.size(); i++) {
for (int b = ind; b <= windowSize + ind; b++) {
window.add(fileArray.get(b));
}
ind++;
}
第一个抛出java.lang.IndexOutOfBoundsException
,而第二个抛出fileArray
并且工作正常。 window
对于两者都是相同的,但对于2. {{1}}数组被定义为属性,而对于第一个,“window”数组在方法内定义(和for循环) 。这有什么不同吗?
答案 0 :(得分:2)
您无法获得IndexOutOfBoundsException
来为列表添加值。问题是s
的值等于或大于fileArray
数组或列表的实际大小。
因为两个示例中的循环都是等效的,所以问题应该在您刚刚发布的代码行之外找到。
尝试调试(如果您使用的是IDE,请暂停IndexOutOfBoundsException
,否则请添加一些简单的System.out.println
语句,以找出s
大于预期的原因。
答案 1 :(得分:0)
从第一个例子开始,你要告诉我:
windowSize
= 30。fileArray.size()
= 235。然后,你的第一个for循环将在i + windowSize > 235
时终止(这意味着我= 236 - 30 = 206`。
您会发现windowStart
在第一个for-loop
内增加,所以最终,windowStart
将增加205
次(从0开始)。
此时,第二个for-loop
将计算(windowStart = 205
),您的条件s <= windowStart + windowSize
将是(s = 205 + 30
等于235
),这满足循环中的条件,并且您说的是fileArray.get(s)
,这意味着fileArray.get(235)
,并且您获得了IndexOutOfBoundsException
。
我假设windowSize
在第二个例子中不一样,但在看到完整的源代码之前我无法告诉你。
希望这有帮助。