簡體   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