带有null arrayList的java.lang.IndexOutOfBoundsException

时间:2013-10-10 21:14:20

标签: java arraylist

我的代码在使用包含对象的ArrayList进行测试时有效,但在arrayList为空时会发出以下错误:

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

我出错了什么?

获取面积最小的Rectangle  返回面积最小的矩形或null if  没有矩形。

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;
        }

    }
}

3 个答案:

答案 0 :(得分:5)

  

我的代码在使用包含对象的ArrayLists进行测试时工作但是输出错误java.lang.IndexOutOfBoundsException:Index:0,Size:当arrayList为空时为0。我出了什么问题。

ArrayList.get()的行为正好as documented

  

<强>抛出:
  IndexOutOfBoundsException - 如果索引超出范围(index < 0 || index >= size()

没有条目,因此索引0超出范围。如果你想在没有矩形的情况下返回null,你应该明确地这样做:

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

请注意,顺便提一下,对空列表的引用与空引用非常不同。 (你的标题引用了一个“null arrayList” - 没有null对象这样的东西,但是可以有一个空引用...除非在你的情况下没有。)

这需要在 之前完成,否则请致电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;
    }
}

答案 1 :(得分:0)

你基本上是试图从空列表中获取元素零。你不能这样做。

答案 2 :(得分: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表示没有矩形。