2012-03-28 202 views
0

此循環很奇怪。Java索引數組超出範圍

我在Java中運行它,它給出了一個索引越界異常。我無法在源代碼的任何地方找到一個int l聲明,我無法弄清楚它是什麼,並發現這樣聲明是合法的。

但這裏的交易是,我不明白這段代碼在做什麼。對於任何尺寸的resultSIList,它都會給出ArrayIndexOutOfBoundsException

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

編輯:感謝所有。

這是我用來試圖理解這個整個循環的可運行代碼。是的,這是一件可怕的垃圾。

public class IndexOutOfBoundsTest { 
    public static void main(String args[]){ 
     int offset = 50; 

     int maxItemsInOnePage = 50; 

     int totalSIs = 50; 

     final int buildThis = 15; 

     List resultSIList = new ArrayList(); 

     // build list 
     for(int zz = 0; zz < buildThis; zz ++){ 
      resultSIList.add("Hi " + zz); 
     } 

     try{ 
      for (int i = offset, 
        d = Math.min(i + maxItemsInOnePage, totalSIs); 
        i < d; i++){ 

       System.out.println(resultSIList.get(i)); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

我有一個詞給你:調試器。逐步瞭解行爲如何不符合您的假設。 – duffymo 2012-03-28 09:23:20

+1

你可以有一個消極的'抵消'? – 2012-03-28 09:24:01

+0

resultSIList的大小是多少 – 2012-03-28 09:25:52

回答

1

它將按預期當且僅當totalSIs等於或小於該resultSIList的大小。仔細檢查該值。下面是一些隨機值工作示例:

List<Integer> resultSIList = Arrays.asList(1,2,3,4,5,6,7,8); 
int totalSIs = resultSIList.size(); 
int maxItemsInOnePage = 2; 
int offset = 1; 

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    resultSIList.get(i); 
} 

從你添加的代碼我明白了,那totalSIs較大(= 50),則列表大小(= 15)。

您可以添加

totalSIs = resultsSIList.size(); 

權背後的for循環速戰速決。

+0

嗨安德烈亞斯,我認爲你是對的這個。你有任何想法,如果這是像一個代碼錯誤的東西,或者它真的試圖做一些事情嗎? – 2012-03-28 09:50:36

+0

它可能在上下文中做了一些合理的事情 - 我不知道,你所展示的代碼是一種非常複雜的方式來拋出AIOOBE;) – 2012-03-28 09:55:22

0

檢查offset是否小於您的列表大小。

+1

如果'offset'大於或等於(可能是'totalSIs'),那麼'for'身體不會運行(由於'我 2012-03-28 09:26:34

2

此代碼將'resulSIList'從'offset'位置循環到'offset + maxItemsInOnePage'和'totalSIs'的最小值。

如果offset> 0且totalSIs = resultSIList.size()我認爲它不會給你一個越界異常。

在您的示例中,您的偏移量爲50,列表大小僅爲15.您必須檢查偏移量是否小於列表大小。

1

得到一些你可以運行它與一些日誌添加了更多的信息:

System.out.println("offset: " + offset); 
System.out.println("maxItemsInOnePage: " + maxItemsInOnePage); 
System.out.println("totalSIs: " + totalSIs); 
System.out.println("resultSIList.size(): " + resultSIList.size()); 
for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); i < l; i++){ 
    System.out.println("i: " + i); 
    resultSIList.get(i); 
} 

運行這應該闡明你的問題的一些光;我打印的最後一張圖片是不受限制的,並且通過分析四個首次打印輸出,您應該可以找到您的問題。

0

您應經常檢查自己是否您的索引小規模

for (int i = offset, l = Math.min(i + maxItemsInOnePage, totalSIs); 
     i < l && i < resultSIList.size(); 
     i++){ 
    resultSIList.get(i); 
}