Как исправить индекс Arraylist вне границ для ошибки длины в Java - PullRequest
0 голосов
/ 03 апреля 2019

Я пишу программу для школы, которая действует как кассовый аппарат. Я прошу вводить цены товаров и воспроизводить их в текущем ArrayList до тех пор, пока пользователь не введет -1 или 0. 0 для повторного ввода предыдущей цены в случае ошибки и -1 завершает цикл.

Я получаю

java.lang.IndexOutOfBoundsException: индекс 0 выходит за пределы длины 0

ошибка при попытке запустить мой код. Я должен включить метод с именем removeLastEntry(), который удалит последнюю цену, введенную в массив, после ввода пользователем 0. Как я могу убедиться, что массив заполнен и я действительно удаляю последнюю запись?

Я использую Java 11 в Eclipse.

Код работает нормально без использования метода, так как я уменьшаю свой счетчик и на следующей итерации цикла предыдущее местоположение массива перезаписывается независимо от того, был ли он удален или нет. Сам метод настроен на удаление ArrayList.size () - 1, чтобы он удалял последнюю запись. Я пробовал это с -2 и 0, и это все еще выходит за пределы.

Я прочитал предыдущие вопросы, и многие люди не заполнили массив. Поэтому я запустил заглушку для печати, чтобы убедиться, что ArrayList был правильно заполнен, и он имеет: когда два элемента были помещены в размер ArrayList был равен 2. Код ошибки также увеличивается, чем больше элементов я помещаю в код, но всегда предметов - 1 индекс за пределами на предметах - 1 длина Я уверен, что совершаю ошибку новичка, но я не могу ее найти, и это сводит меня с ума!

для полного контекста ошибки:

Исключение в потоке "main" java.lang.IndexOutOfBoundsException: индекс 0 выходит за пределы длины 0 в java.base / jdk.internal.util.Preconditions.outOfBounds (Preconditions.java:64) в java.base / jdk.internal.util.Preconditions.outOfBoundsCheckIndex (Preconditions.java:70) в java.base / jdk.internal.util.Preconditions.checkIndex (Preconditions.java:248) в java.base / java.util.Objects.checkIndex (Objects.java:372) в java.base / java.util.ArrayList.get (ArrayList.java:458) в C_M_iDeaProject.main (C_M_iDeaProject.java:76)

// declare our array list which will hold our prices!
ArrayList<Double> prices = new ArrayList<Double>();


// declaring variables to terminate loop, count prices, total prices, and current entry for conditions
        int counter  = 0;
        double entry = 0;
        double total = 0;

// our loop to continuously add prices to the array list from input
while (entry != -1) {

    System.out.println("Enter a price for item #" + (counter+1) + ": ");
    entry = myInput.nextDouble();

// if the entry is a price we will add it to prices and continue with the loop

    if (entry != 0 && entry != -1) {
            prices.add(entry);
            total += entry;
            counter++;
    }

//if the entry is 0 we will revert back to the previous iteration to re-add

    else if (entry == 0.0) {
        total -= prices.get(counter-1);
        removeLastEntry(prices);
        counter--;
    }

public static void removeLastEntry(ArrayList<Double> anArrayList) {
    anArrayList.remove(anArrayList.size()-1);
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Вы можете добавить проверку, чтобы увидеть , если список пуст :

// declare our array list which will hold our prices!
ArrayList<Double> prices = new ArrayList<Double>();


// declaring variables to terminate loop, count prices, total prices, and current entry for conditions
        int counter  = 0;
        double entry = 0;
        double total = 0;

// our loop to continuously add prices to the array list from input
while (entry != -1) {

    System.out.println("Enter a price for item #" + (counter+1) + ": ");
    entry = myInput.nextDouble();

// if the entry is a price we will add it to prices and continue with the loop

    if (entry != 0 && entry != -1) {
            prices.add(entry);
            total += entry;
            counter++;
    }

//if the entry is 0 we will revert back to the previous iteration to re-add

    else if (entry == 0.0) {
        total -= prices.get(counter-1);
        removeLastEntry(prices);
        counter--;
    }

public static void removeLastEntry(ArrayList<Double> anArrayList) {
    if(!anArrayList.isEmpty()) {
        anArrayList.remove(anArrayList.size()-1);
    }
}
0 голосов
/ 03 апреля 2019

Мы решаем проблему, проверяя, пустой ли список, прежде чем пытаться удалить последний элемент в списке - на случай, если первое полученное вами значение равно нулю :) Мы отредактировали исходный код, чтобы инкапсулировать поведение в отношении соглашений (-1 для выхода, 0 для удаления последнего значения) и избежать нарушения этого принципа каждый раз, когда нам нужно проверять.

    List<Double> prices = new ArrayList<Double>();

    // declaring variables to terminate loop, count prices, total prices, and current entry for conditions
    int counter  = 0;
    double entry = 0;
    double total = 0;

    // our loop to continuously add prices to the array list from input
    while (!isExit(entry)) {
        System.out.println(String.format("Enter a price for item # %s: ", counter+1));
        entry = myInput.nextDouble();

    // if the entry is a price we will add it to prices and continue with the loop
        if(isExit(entry)){
            //TODO exit
        }
        if(isRemove(entry)){
            if(!list.isEmpty()){
                total -= removeLastEntry(prices);
                counter--;
            }
        }else{
            prices.add(entry);
            total += entry;
            counter++;
        }

    }

    private boolean isExit(double value){
        return value==-1;
    }

    private boolean isRemove(double entry){
        return entry==0;
    }

    public static double removeLastEntry(List<Double> list) {
        double last = list.get(list.size()-1);
        list.remove(list.size()-1)
        return last;
    }
...