0

第一个例子

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数组被定义为属性,而对于第一个,“窗口”数组在方法(和 for 循环)内部定义。这有什么区别吗?

4

2 回答 2

2

您无法获得IndexOutOfBoundsException用于向列表添加值的方法。问题是 的值s等于或大于fileArray数组或列表的实际大小。

并且因为两个示例中的循环是等效的,所以应该在您刚刚发布的代码行之外找到问题。

尝试调试(IndexOutOfBoundsException如果您使用的是 IDE,请中断,否则添加一些简单的System.out.println语句来找出,为什么s比预期的要大。

于 2012-12-03T07:20:48.727 回答
0

从第一个例子,从你告诉我的:

  • windowSize= 30。
  • fileArray.size()= 235。

然后,您的第一个 for 循环将在i + windowSize > 235(这意味着 i = 236 - 30 = 206`) 时终止。

您会意识到windowStart在 first 内部会增加for-loop,因此最终windowStart会增加205时间(从 0 开始)。

那时,第二个for-loop将计数 ( windowStart = 205) 并且您的条件s <= windowStart + windowSize将是 (s = 205 + 30等于235),它满足循环中的条件,并且您说fileArray.get(s)这意味着fileArray.get(235), 并且您得到一个IndexOutOfBoundsException.

我假设windowSize在第二个示例中不一样,但在我看到完整的源代码之前我不能告诉你。

希望这可以帮助。

于 2012-12-03T07:35:26.447 回答