2012-03-23 152 views
1

我想弄清楚爲什麼我得到這個錯誤。我的代碼如下:IndexOutOfBoundsException:索引:7,大小:7

ArrayList lowestQuant = new ArrayList(); 
    for (int i = 0; i < aRes1.size(); i++) { 
     int var = Math.min(casesQuant.get(i), mainboardQuant.get(i)); 
     int var2 = Math.min(var, cpuQuant.get(i)); 
     int var3 = Math.min(var2, ramQuant.get(i)); 
     int var4 = Math.min(var3, graphicsQuant.get(i)); 
     lowestQuant.add(var4); 
     System.out.println(aRes1.get(i) +" quantity: "+lowestQuant.get(i)); 
    } 

aRes1是計算機系統的用8個的計算機系統的長度的數組列表。

我需要找到每個計算機系統中具有最低數量的組件,因此需要查找Math.min和所有ArrayList-index查找。 此代碼應該提供組件的最低數量,它確實!但不知怎的,它在到達第8臺計算機系統之前就停止了。它與第一個7完美合作。 誰能告訴我問題是什麼? 我看了很多這些錯誤,並試圖設置i=1.size()-1/+1沒有什麼幫助。

在此先感謝! 錯誤:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 7 
      at java.util.ArrayList.RangeCheck(ArrayList.java:547) 
      at java.util.ArrayList.get(ArrayList.java:322) 
      at databasen.Database.ComputerSystems(Database.java:242) 
      at databasen.Database.menuLVL1(Database.java:70) 
      at databasen.Database.mainMenu(Database.java:61) 
      at databasen.Database.main(Database.java:37) 
    Java Result: 1 

爲了澄清:所有使用的數組列表的長度是相同的,因爲它們是從數據庫中取得。這裏有一些更多的代碼,所以你可以看到數組列表是如何製作的:

ArrayList aRes1 = new ArrayList(); 
     Statement st = con.createStatement(); 
     ResultSet rs = st.executeQuery("SELECT catchyname FROM computersystems"); 
     System.out.printf("Computer sytems:\n"); 
     while (rs.next()) { 
      String answer = rs.getString("catchyname"); 
      aRes1.add(answer); 
     } 

     // Cases 
     ArrayList aRes2 = new ArrayList(); 
     rs = st.executeQuery("SELECT cases FROM computersystems"); 
     while (rs.next()) { 
      String answer = rs.getString("cases"); 
      aRes2.add(answer); 
     } 
     ArrayList<Integer> casesQuant = new ArrayList<Integer>(); 
     for (int i=0;i<aRes2.size();i++){ 
      ResultSet rs2 = st.executeQuery("SELECT currentquantity FROM components " 
        + "WHERE name ="+"'"+aRes2.get(i)+"'"); 
      while (rs2.next()) { 
       int answer2 = rs2.getInt("currentquantity"); 
       casesQuant.add(answer2); 
      } 
     } 
+0

Java被索引爲0,因此Java數組中的最後一個有效單元是'size-1'。第八個值在單元格7中。 – twain249 2012-03-23 21:44:07

+1

哪一行是242?這聽起來像列表並不都具有相同的大小... – 2012-03-23 21:46:41

+0

誰是行號547,322,242? – 2012-03-23 21:46:49

回答

0

任何一個數組列表有7個元素。嘗試檢查行號547和322。你會知道哪一個。

+0

我創建上面使用的數組列表的方式將使它們具有與aRes1相同的長度。 – 2012-03-23 21:59:09

1

Java從索引0開始並上升。 7的大小意味着索引爲6. 更改: (int i = 0; i < aRes1.size(); i ++) To: (int i = 0; i < aRes1.size() - 1; i ++) 減一會解決問題。

+0

它不,相信我,我已經嘗試過。但是,謝謝你的建議! – 2012-03-23 21:58:19

+0

@AndreasDam是的。但是,Ryan提供的for循環會跳過最後一個元素。它應該是'我 MrZander 2012-03-23 22:56:10

+0

@Ryan,我建議刪除「更改:...」,因爲它確實是不正確的。 – dldnh 2012-03-24 16:27:49

0

line 242 is " int var = Math.min(casesQuant.get(i), mainboardQuant.get(i)); "

在這之前添加以下行:

System.out.printf("Expected: #s, Cases: #s, Mainboards: #s#n", aRes1.size(), 
     casesQuant.get(i), mainboardQuant.get(i)); 

一個數量應小於預期值。

0

您正在處理多個數組並非都具有相同的大小,而是使用所有數組上的一個數組的索引。這是例外的原因。