为什么我继续获取ArrayIndexOutofBoundsException?

时间:2013-12-11 03:01:01

标签: java arrays indexoutofboundsexception

我正在尝试编写一个程序来模仿我的CS类自动售货机的操作。我有一个双阵列股票,代表特定“槽”的项目数量[我的自动售货机很奇怪,有点像一个长的自动售货机有1列不同的项目]。到目前为止,这是我的代码:

public class VendingMachine
{
    // define fields here
    public static double itemPrice[];
    public static String[] itemName; 
    public static int stock[][];
    public static  int maxPerSlot;
    public static double cashAmmount;

    public VendingMachine(int numslots, int maxperslot, double cash)
    {   
        final  int numSlots = numslots;
        maxPerSlot = maxperslot;
        cashAmmount = cash;
        stock = new int[numSlots][0];

        itemPrice = new double[numSlots];
        itemName = new String[numSlots];

        // complete this method
    }

    public void setProduct(int slot, String product, double price)
    {   int Slot = slot;
        itemPrice[slot] = price; 
        itemName[slot] = product;
        stock[Slot][0] = 0; 

        //
    }

    public void restockProduct(String product, int quantity)
    {   
        String Product = product;
        int currentCapacity = quantity - maxPerSlot;
        for(int i = 0; i < stock.length; i++){
            if (itemName[i]==Product){
                for(;quantity <= maxPerSlot && currentCapacity != 0; quantity--)
                stock[i][0] += 1;
            }   
        }


        //Put # of products in slot that holds it and if that slot is full put the rest in the next 
        //availble slot that holds that product, if all full return error.
    }

    public double getCashOnHand()
    {
        return cashAmmount; // replace this line with your code
    }

    public int getQuantity(int slot)
    {
        return stock[slot][1]; // replace this line with your code
    }

    public int getQuantity(String product)
    {   int total = 0;

        for (int i = 0; i<itemName.length;i++){
            if (product == itemName[i]){
                total += stock[i][1];
            }
        }
        return total;
    }

    public boolean buyItem(int slot)
    {   int snum = slot;
        if (stock[snum][1] != 0){
            stock[snum][1]--;
        return true;
        } else {
        return false;} // replace this line with your code
    }
}

每次在线程“main”中运行runception时java.lang.ArrayIndexOutOfBoundsException:0     在VendingMachine.setProduct(VendingMachine.java:27)     在vmd.main(vmd.java:9)此代码虽然我收到此错误消息:

有人可以在这里向我解释为什么我会继续收到这个错误吗?我的意思是逻辑看起来很正确。

5 个答案:

答案 0 :(得分:1)

你的问题在这里:

stock = new int[numSlots][0];

这定义了一个numSlot数组的数组,每个数组的长度为0。

答案 1 :(得分:1)

在构造函数中初始化股票时,请执行以下操作:

stock = new int[numSlots][1];

使用0代替1初始化长度为0的数组!

答案 2 :(得分:0)

您在stock

的第二维中分配零元素
stock = new int[numSlots][0];

因此当您尝试访问索引为零的元素时会出现该异常。

stock[Slot][0] = 0;

答案 3 :(得分:0)

这一行

stock = new int[numSlots][0]; // <-- A length of zero? You want a one there.

应该是

stock = new int[numSlots][1]; // <-- like so. Or, if you really don't 
           // want to change your other code make it a 2.
           // But you'll leave memory unused, and you really should change it.

其他地方(你有这样的代码) -

stock[slot][1] // <-- stock[INDEX][1] <--- should be 0.

喜欢这个

stock[slot][0] // <-- all of the other accesses.

答案 4 :(得分:0)

因为这一行:

stock = new int[numSlots][0];

stock分配为数组数组,并且每个数组的长度都为0.因此,您无法将任何内容分配给这些数组(它们没有任何要分配的元素)。所以当你这样做时:

    stock[Slot][0] = 0; 

您将获得ArrayIndexOutOfBounds。请记住,在Java中,索引从0开始,所以如果你想要一个索引从0到N的数组,你必须分配大小为N + 1的数组。