java这两段代码之间的区别是什么?
第一个例子
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++;
}
与
第二个例子
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
对两者都是一样的,但对2来说是一样的。window
数组被定义为一个属性,而对于第一个数组,“窗口”数组是在方法(和for循环)内部定义的。这有区别吗
# 1 楼答案
从第一个例子,从你告诉我的:
windowSize
=30李>fileArray.size()
=235李>然后,您的第一个for循环将在
i + windowSize > 235
(这意味着i=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
是不一样的,但是在我看到完整的源代码之前,我不能告诉你这一点希望这有帮助
# 2 楼答案
在列表中添加值时,无法获得
IndexOutOfBoundsException
。问题是s
的值等于或大于fileArray
数组或列表的实际大小因为这两个例子中的循环是等价的,所以问题应该在您刚刚发布的代码行之外找到
如果您使用的是IDE,请尝试调试(在
IndexOutOfBoundsException
上中断),否则请添加一些简单的System.out.println
语句,以找出s
大于预期的原因