获得"索引:0"和"大小:0" ArrayList.size()中的错误

时间:2014-03-17 02:49:19

标签: java arraylist indexoutofboundsexception

我已经在这个程序上工作了几个小时,并且已经解决了几乎所有其他课程中出现的错误。然而,这个,我似乎可以修复接收方法。接收方法应首先检查(通过比较SKU)传入产品是否已在myCatalog中。如果没有,请将产品(通过其SKU)添加到目录中。在那之后,无论如何 - 只要还有一些传入的产品还没有被放入垃圾箱 - 我想找到哪个垃圾箱包含的总数量最少。 (如果所有垃圾箱已满,请添加一个新的空垃圾箱)我将该特定产品添加到该垃圾箱,直到垃圾箱已满 - 此时我会重复 - 或者我用完了产品。重复此过程,直到不再有进入的产品为止。

public class Warehouse
{
    private int myBinMax;
    private ArrayList<MusicMedia> myCatalog;
    private ArrayList<Bin> myBins;
    public Warehouse( int binMax )
    {
        myBinMax = binMax;
        myCatalog = new ArrayList<MusicMedia>();
        myBins = new ArrayList<Bin>( 5 );
    }

    public String toString()
    {
        return Tester.detailedInventory(myCatalog,myBins);
    }

    public void addBin()
    {
        myBins.add( new Bin( "B" + myBins.size() ) );
    }

    public void receive( MusicMedia product, int quantity )
    {
        boolean contained = false;
        int lowestAmount = myBinMax,
        leastFullBinIndex,
        i,
        insertQuantity;

        for(MusicMedia entry : myCatalog)
        {
            if(entry.getSKU().equals(product.getSKU()))
            {
                contained = true;
            }
        }

        if(!contained)
        {
            myCatalog.add(product);
        }

        while(quantity > 0)
        {
            lowestAmount = myBinMax;
            for(i = 0; i < myBins.size(); i++)
            {
                if(myBins.get(i).totalQuantity() < lowestAmount)
                {
                    lowestAmount = myBins.get(i).totalQuantity();
                    leastFullBinIndex = i;
                }

                if((i == myBins.size() - 1 && lowestAmount == myBinMax)||(myBins.size() == 0))
                {
                    myBins.add(new Bin("bin" + Integer.toString(i)));
                }
            }

            if(quantity >= myBinMax - lowestAmount)
            {
                insertQuantity = myBinMax - lowestAmount;
            }
            else
            {
                insertQuantity = quantity;
            }
            quantity -= insertQuantity;
            myBins.get(i).add(new BinItem(product.getSKU(), insertQuantity));
        }
    }
}

在我上次编辑之前,没有任何内容可以打印 - 只是一个空白的控制台 - 但是为了解决这个问题,我添加了这个(也包含在上面的代码中):

if((i == myBins.size() - 1 && lowestAmount == myBinMax)||(myBins.size() == 0))
{
myBins.add(new Bin("bin" + Integer.toString(i)));
}

现在,在没有给我错误的情况下它不会运行:

java.lang.IndexOutOfBoundsException
Index: 0, Size 0 (in java.util.ArrayList)

以及突出显示以下内容:

myBins.get(i).add(new BinItem(product.getSKU(), insertQuantity));

这里列出了为这个巨大程序创建的各种类:

MusicMedia有三个私有变量,但这里唯一有变量的是String mySKU,由getSKU()获取

Bin有一个私有的String,name,它也是唯一的参数,以及一个BinItem类的私有ArrayList。为了从另一个类访问BinItems的这个ArrayList,你可以使用getContents()。它还有方法totalQuantity(),它返回已经在bin中的对象的总数量。

BinItem有私有变量mySKU(String)和myQuantity(int)以及方法getSKU()和getQuantity(),它们都是该顺序的参数

1 个答案:

答案 0 :(得分:1)

首先,你没有垃圾箱。

您的“for”块被跳过,因为大小为零;

所以我们到了“while”循环的最后一行,然后执行myBins.get(i)...... 这是我们得到错误的地方,因为我们无法在索引0处获取bin,因为我们根本没有垃圾箱。

问题是我们在没有添加任何垃圾箱的情况下达到了这行代码......

我不确定你是否意识到,下面这行不能用5个箱子启动你的程序。

myBins = new ArrayList<Bin>( 5 );

此代码中的5设置数组的内部缓冲区以容纳5个项目。如果我们没有提供数字,那么它将从10开始。但是这些数字只是为了让程序员能够控制存储器的数量。

如果你的目标是从5个箱子开始,你应该做如下的事情:

myBins = new ArrayList<Bin>( 5 );

for(int i=0; i<5; i++){
    myBins.add(new myBin());
}