Получение ошибок «index: 0» и «size: 0» из ArrayList.size ()

1

Я работаю над этой программой часами и выработал почти все ошибки, возникающие в каждом другом классе. Тем не менее, я могу исправить метод получения. Метод приема должен сначала проверить (путем сравнения 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 имеет три частные переменные, но единственное, что имеет здесь отношение, это строка mySKU, полученная getSKU()

Bin имеет частное имя String, которое также является его единственным аргументом, а также частный ArrayList класса BinItem. Чтобы получить доступ к этому ArrayList BinItems из другого класса, вы должны использовать getContents(). Он также имеет метод totalQuantity(), который возвращает общее количество объектов, уже находящихся в корзине.

BinItem имеет частные переменные mySKU (String) и myQuantity (int) и методы getSKU() и getQuantity(), оба являются его аргументами в этом порядке

Теги:
arraylist
indexoutofboundsexception

1 ответ

1

Поэтому для начала у вас нет бункеров.

Ваш блок "for" пропускается, поскольку размер равен нулю;

Итак, мы добираемся до последней строки цикла while, и мы выполняем myBins.get(i)... Вот где мы получаем ошибку, потому что мы не можем получить бит в индексе 0, потому что у нас нет бункеров вообще.

Проблема в том, что мы достигли этой строки кода без добавления каких-либо бункеров...

Я не уверен, что вы поняли, строка ниже не запускает вашу программу с 5 бункерами.

myBins = new ArrayList<Bin>( 5 );

5 в этом коде устанавливает внутренний буфер для массива для хранения 5 элементов. Если бы мы не указали номер, это началось бы с 10. Но цифры просто там, чтобы дать программистам возможность контролировать, сколько memmory инициализировано.

Если бы ваша цель состояла в том, чтобы начать с 5 бункеров, вы должны сделать что-то следующим образом:

myBins = new ArrayList<Bin>( 5 );

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню