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

ちなみに、空のリストへの参照は null 参照とは大きく異なることに注意してください。(タイトルは「null arrayList」を参照しています-nullオブジェクトなどはありませんが、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

基本的に、空のリストから要素ゼロを取得しようとしています。そんなことはできません。

于 2013-10-10T21:16:22.493 に答える