繁体   English   中英

这两段代码有什么区别?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM