2013-10-10 62 views
-2

我的代碼工作時與包含對象的ArrayList測試,但放出來的時候,arrayList是空以下錯誤:什麼我收到錯誤java.lang.IndexOutOfBoundsException與空的ArrayList

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 

獲取Rectangle面積最小 面積最小或null返回矩形如果 沒有矩形。當數組列表是空的0:

import java.util.ArrayList; 

public class RectangleList 
{ 

    ArrayList<Rectangle> list = new ArrayList<Rectangle>(); 

    public RectangleList(ArrayList<Rectangle> theList) 
    { 
     list = theList; 
    } 

    /** 
    * Gets the Rectangle with the smallest area 
    * 
    * @return the rectangle with the smallest area or null if there are no 
    *   rectangles 
    * 
    */ 
    public Rectangle smallestArea() 
    { 

     Rectangle currentsmallestRectangle = list.get(0); 
     for (int i = 0; i < list.size(); i++) { 

      Rectangle nextRectangle = list.get(i); 

      if (list.isEmpty()) { 
       return null; 
      } else if ((nextRectangle.getWidth() * nextRectangle.getHeight()) < (currentsmallestRectangle 
        .getWidth() * currentsmallestRectangle.getHeight())) { 
       currentsmallestRectangle = nextRectangle; 

      } 

      return currentsmallestRectangle; 
     } 

    } 
} 
+7

如果您的'List'爲空,則無法訪問索引爲0的元素。 –

+0

檢測您是否有一個帶'size()'方法的空'ArrayList';你必須以某種方式處理該條件:返回'null',或拋出'Exception',或者... – rgettman

+0

並且爲了將來的參考,包括行號(並突出顯示哪一行)拋出異常的地方非常有用。 – nhgrif

回答

5

大家好,我的代碼工作時與包含對象的ArrayList測試,但拿出錯誤java.lang.IndexOutOfBoundsException:指數:0,大小。我錯了什麼。

ArrayList.get()表現正好as documented

拋出:
IndexOutOfBoundsException - 如果索引超出範圍(index < 0 || index >= size()

沒有條目,所以索引0是出界。如果你想返回null如果沒有矩形,你應該做的是明確的:

// Alternatively, if list.size() == 0 
if (list.isEmpty()) { 
    return null; 
} 

需要注意的是一個空列表的引用是空引用非常不同的,順便說一句。 (你的標題指的是一個「null arrayList」 - 沒有這樣的東西作爲空對象,但可以有一個空引用...除非沒有在你的情況。)

這需要完成之前,您還需要撥打list.get(0) - 並且只能使用一次。 (什麼是稱這是在循環的地步呢?)例如:

public Rectangle smallestArea() { 
    if (list.isEmpty()) { 
     return null; 
    } 
    Rectangle currentsmallestRectangle = list.get(0); 
    // Note that you can go from 1, not 0... 
    for (int i = 1; i < list.size(); i++) { 
     Rectangle nextRectangle = list.get(i); 
     if ((nextRectangle.getWidth() * nextRectangle.getHeight()) < 
      (currentsmallestRectangle.getWidth() * 
      currentsmallestRectangle.getHeight())) { 
      currentsmallestRectangle = nextRectangle; 
     } 
    } 
    return currentSmallestRectangle; 
} 

理想的情況下,添加一個area()方法您Rectangle類,使循環簡單:

for (int i = 1; i < list.size(); i++) { 
    Rectangle nextRectangle = list.get(i); 
    if (nextRectangle.area() < currentSmallestRectangle.area()) { 
     currentsmallestRectangle = nextRectangle; 
    } 
} 
+0

我試圖顯式返回null,就像你指出的那樣,它沒有工作。 – user2868810

+0

@ user2868810:它應該工作得很好。如果您需要我們幫助您找出問題所在,那麼您需要告訴我們發生了什麼事。 「它不起作用」並不足夠*的信息。 –

+0

對不起。如果ArrayList爲空,代碼應該返回Rectangle的ArrayList列表中最小區域的Rectangle,並輸出null。我已經使用If條件修改了代碼,但仍然存在相同的IndexOutOfBound異常錯誤。 – user2868810

0

你基本上試圖從空列表中獲取元素零。你不能那樣做。

+0

你可以提出一個建議如何處理,我已經嘗試了很多選項,甚至在這裏提出的,他們似乎不工作 – user2868810

0

你可以這樣做:

try 
    { 
     Rectangle currentsmallestRectangle = list.get(0); 
    } 
    catch(IndexOutOfBoundsException e) 
    { 
     return 0;//Do something here to fix exception 
    } 

if(!list.isEmpty()) 
    { 
     Rectangle currentsmallestRectangle = list.get(0); 
    } 
    else 
    { 
     return 0;//Put something here as default. maybe a rectangle size 0. 
    } 

你不檢查,如果列表中有什麼在這麼有問題,如果你不好好照顧它。上面的兩段代碼可以糾正它們,它們會返回0表示沒有矩形。

+0

這沒有奏效 – user2868810

相關問題