Java中如何纠正长度错误导致的Arraylist索引越界

Java中如何纠正长度错误导致的Arraylist索引越界,java,arraylist,indexoutofboundsexception,Java,Arraylist,Indexoutofboundsexception,我正在为学校写一个程序,它充当收银机。我请求输入物品的价格,并将它们放入正在进行的ArrayList中,直到用户输入-1或0。如果出现错误,0将重新输入上一个价格,-1将终止循环 我得到了 java.lang.IndexOutOfBoundsException:索引0超出长度0的界限 尝试运行代码时出错。 我必须包括一个名为removeLastEntry()的方法,该方法将在用户输入0时删除数组中输入的最后一个价格。如何确保数组已填充,并且确实正在删除最后一个条目 我正在Eclipse中运行Ja

我正在为学校写一个程序,它充当收银机。我请求输入物品的价格,并将它们放入正在进行的ArrayList中,直到用户输入-1或0。如果出现错误,0将重新输入上一个价格,-1将终止循环

我得到了

java.lang.IndexOutOfBoundsException:索引0超出长度0的界限

尝试运行代码时出错。 我必须包括一个名为
removeLastEntry()
的方法,该方法将在用户输入0时删除数组中输入的最后一个价格。如何确保数组已填充,并且确实正在删除最后一个条目

我正在Eclipse中运行Java11

代码在没有使用该方法的情况下运行良好,因为我减少了计数器,并且在循环的下一次迭代中,上一个数组位置被覆盖,不管它是否已被删除。该方法本身设置为删除ArrayList.size()-1,以便删除最后一个条目。我已经用-2和0尝试过了,但仍然超出了范围

我通读了前面的问题,许多人还没有填充数组。 因此,我运行了一个打印存根,以确保ArrayList已正确填充,并且已正确填充:当两个项目放置到ArrayList中时,其大小等于2。我在代码中放入的项目越多,错误代码也越高,但在项目长度为-1时,总是项目-1索引超出范围 我确信我犯了一个新手错误,但我找不到它,这让我发疯

对于完整的错误上下文:

线程“main”java.lang.IndexOutOfBoundsException中的异常:索引0超出长度0的界限 位于java.base/jdk.internal.util.premissions.outOfBounds(premissions.java:64) 位于java.base/jdk.internal.util.premissions.outOfBoundsCheckIndex(premissions.java:70) 位于java.base/jdk.internal.util.premissions.checkIndex(premissions.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)

//声明我们的数组列表,它将保存我们的价格!
ArrayList价格=新的ArrayList();
//声明变量以终止循环、计算价格、总价和条件的当前条目
int计数器=0;
复式输入=0;
双倍合计=0;
//我们的循环将不断从输入向数组列表添加价格
while(条目!=-1){
System.out.println(“为项目输入价格”+(计数器+1)+:”;
entry=myInput.nextDouble();
//如果条目是一个价格,我们将把它添加到价格中并继续循环
如果(条目!=0&&entry!=-1){
价格。添加(条目);
总数+=条目;
计数器++;
}
//如果条目为0,我们将返回到上一次迭代以重新添加
else if(条目==0.0){
总计-=价格。获取(计数器1);
重新进入(价格);
计数器--;
}
公共静态void removeLastEntry(ArrayList anArrayList){
anArrayList.remove(anArrayList.size()-1);
}

我们通过在尝试删除列表中的最后一个元素之前检查列表是否已为空来解决此问题-以防您收到的第一个值为零:) 我们编辑了原始代码,以封装有关约定的行为(-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;
    }
List prices=new ArrayList();
//声明变量以终止循环、计算价格、总价和条件的当前条目
int计数器=0;
复式输入=0;
双倍合计=0;
//我们的循环将不断从输入向数组列表添加价格
而(!isExit(条目)){
System.out.println(String.format(“输入商品#%s:,计数器+1的价格”);
entry=myInput.nextDouble();
//如果条目是一个价格,我们将把它添加到价格中并继续循环
如果(isExit(条目)){
//待办事项出口
}
如果(isRemove(条目)){
如果(!list.isEmpty()){
总-=重新进场(价格);
计数器--;
}
}否则{
价格。添加(条目);
总数+=条目;
计数器++;
}
}
私有布尔isExit(双值){
返回值==-1;
}
专用布尔值isRemove(复式输入){
返回条目==0;
}
公共静态双移除ASTENTRY(列表){
double last=list.get(list.size()-1);
list.remove(list.size()-1)
最后返回;
}

我们通过在尝试删除列表中的最后一个元素之前检查列表是否已为空来解决此问题-以防您收到的第一个值为零:) 我们编辑了原始代码,以封装有关约定的行为(-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;
    }
List prices=new ArrayList();
//声明变量以终止循环、计算价格、总价和条件的当前条目
int计数器=0;
复式输入=0;
双倍合计=0;
//我们的循环将不断从输入向数组列表添加价格
而(!isExit(条目)){
System.out.println(String.format(“输入商品#%s:,计数器+1的价格”);
entry=myInput.nextDouble();
//如果条目是一个价格,我们将把它添加到价格中并继续循环
如果(isExit(条目)){
//待办事项出口
}
如果(isRemove(条目)){
如果(!list.isEmpty()){
总-=重新进场(价格);
计数器--;
}
}否则{
价格。添加(条目);
总数+=条目;
计数器++;
}
}
私有布尔isExit(双值){
返回值==-1;
}
私有布尔i