-2

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

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

我怎么了?

获取Rectangle面积最小的返回面积最小的矩形,或者null如果没有矩形。

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

    }
}
4

3 回答 3

5

嗨,我的代码在使用包含对象的 ArrayLists 进行测试时有效,但当 arrayList 为空时会输出错误 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0。我怎么了。

ArrayList.get()行为与记录的完全一样

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

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

// Alternatively, if list.size() == 0
if (list.isEmpty()) {
    return 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;
    }
}
于 2013-10-10T21:15:58.163 回答
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 表示没有矩形。

于 2013-10-10T21:23:19.247 回答
0

您基本上是在尝试从空列表中获取元素零。你不能那样做。

于 2013-10-10T21:16:22.493 回答