2013-12-11 7 views
1

Я пытаюсь запрограммировать программу, которая имитирует действия торгового автомата для моего класса CS. У меня есть запас двойного массива, который представляет количество элементов в определенном «слоте» [мой торговый автомат странный и похож на один длинный торговый автомат с 1 столбцом разных товаров]. Вот мой код до сих пор:Почему я продолжаю получать исключение ArrayIndexOutofBoundsException?

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 
    } 
} 

Каждый раз, когда я runException в потоке "основного" java.lang.ArrayIndexOutOfBoundsException: 0 в VendingMachine.setProduct (VendingMachine.java:27) в vmd.main (VMD. java: 9) этот код, хотя я получаю это сообщение об ошибке:

Может кто-то здесь объяснить мне, почему я продолжаю эту ошибку? Я имею в виду, что логика кажется вполне правильной.

+0

поэтому у вас есть ошибка, исходящая от вашей основной функции, но вы не собираетесь включать ее в свой код? –

ответ

1

Ваша проблема здесь:

stock = new int[numSlots][0]; 

Это определяет массив numSlot массивов с длиной 0 каждый.

0

Вы выделяете нулевые элементы во втором измерении stock,

stock = new int[numSlots][0]; 

так что вы получите это исключение при попытке доступа к элементу с индексом ноль.

stock[Slot][0] = 0; 
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. 
0

Поскольку эта линия:

stock = new int[numSlots][0]; 

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

stock[Slot][0] = 0; 

вы получите ArrayIndexOutOfBounds. Помните, что в Java индексы начинаются с 0, поэтому, если вам нужен массив, где индексы идут от 0 до N, вам нужно выделить массив размером N + 1.

1

при инициализации запаса в конструкторе сделать это вместо того, чтобы:

stock = new int[numSlots][1]; 

используя 0 вместо 1 инициализирует массив длины 0!

Смежные вопросы