[英]What is the difference between these two sections of code?
第一个例子
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
对于两者都是相同的,但对于2. window
数组被定义为属性,而对于第一个,“window”数组在方法内部定义(和for循环)。 这有什么区别吗?
您无法获得IndexOutOfBoundsException
以向列表添加值。 问题是s
的值等于或大于fileArray
数组或列表的实际大小。
并且因为两个示例中的循环都是等效的,所以应该在您刚刚发布的代码行之外找到问题。
尝试调试(如果您使用的是IDE,则抛出IndexOutOfBoundsException
,否则添加一些简单的System.out.println
语句以找出,为什么s
大于预期。
从第一个例子开始,从你告诉我的内容:
windowSize
= 30。 fileArray.size()
= 235。 然后,当i + windowSize > 235
时,你的第一个for循环将终止(这意味着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
在第二个例子中不一样,但在看到完整的源代码之前我无法告诉你。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.