这两段代码有什么区别?

时间:2012-12-03 07:03:33

标签: 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++;
}

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循环) 。这有什么不同吗?

2 个答案:

答案 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在第二个例子中不一样,但在看到完整的源代码之前我无法告诉你。

希望这有帮助。