2015-01-23 2 views
-1

Для моего курса Computer Science мы создаем программу, имитирующую бизнес-торговый автомат. Все, кажется, не имеют каких-либо ошибок, но затем эта строка в драйвере работает,Tricky NullPointerException

VendingMachine pv0001 = new SnackMachine(19.00); 
pv0001.addItem(new Chips("Doritos")); 

возвращает эту ошибку

Exception in thread "main" java.lang.NullPointerException 
    at SnackMachine.addItem(SnackMachine.java:35) 
    at Driver.main(Driver.java:9) 

Который, по-видимому, вытекающих из декларации этого, если заявлении SnackMachine код:

public boolean addItem(VendingMachineItem item) 
    { 
     if((item instanceof Snack) && (inventory.size() < maxCapacity))//error on this line 
     { 
      inventory.add(item); 
      return true; 
     }else{ 
      return false; 
     } 
    } 

Я не могу понять, в чем проблема, может ли кто-нибудь мне помочь?

+1

Что такое 'inventory'? Покажите нам, где это объявлено. – TNT

+1

Почему бы не использовать отладчик, или если у вас его нет, вставьте инструкции println, чтобы выгрузить значения перед этим оператором. Предполагая, что вы правильно определили строку, скорее всего 'inventory' имеет значение null. –

+0

Как правило, я настоятельно рекомендую префикс любых переменных экземпляра, которые вы ссылаетесь на 'this.'. Это делает очевидным, что переменные являются переменными экземпляра, и это снижает риск ошибок из-за затенения. – jpmc26

ответ

1

Вы инициализировали inventory?

+0

Могу ли я инициализировать инвентарь в классе SnackMachine или в классе VendingMachine, который он расширяет? – Ziggy

+0

@ Ziggy Вероятно, VendingMachine предполагает, что он задал исходную переменную, хотя SnackMachine также может заменить значение в своем конструкторе, если у него есть причина. (Я не могу придумать причину, которая могла бы быть.) Независимо, вы должны инициализировать ее * где-то *, прежде чем сможете ее использовать. – jpmc26

0

Убедитесь, что inventory инициализирован, когда объект VendingMachine инициализирован.

0

NullPointer Исключение происходит, когда вы объявляете переменную, но не создаете объект, поэтому указывает на значение NULL. Чтобы исключить этот тип исключения, проверьте значение null, если вы не создали объект самостоятельно.

public boolean addItem(VendingMachineItem item) 
    { if(item == null)System.out.println("Item passed in must equal to null."); } 

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