2013-12-08 4 views
0

В моей программе у меня есть класс под названием Hive, который содержит Honey, Pollen, royalJelly и arraylist нескольких видов пчел. Некоторые из видов пчел имеют метод съедания, который в значительной степени идентичен между ними с разницей в том, что они едят, или количеством, которое они едят. У каждой пчелы есть метод AnotherDay, который вызывает метод eat на пчеле, а в другом методе DayDay он проходит через аррайалист, называя каждого пчелы anotherDay. Моя королева пчелы едят работает отлично, однако, когда я бегу есть на мой рабочий, гул или личинки, я получаю исключение NullPointerException, и я не могу понять, почему! Мой код:В чем причина моего NullPointerException?

Улей класс:

public class Hive { 

    ArrayList<Bee> cells = new ArrayList<Bee>(); 
    int honey = 10; 
    int royalJelly = 10; 
    int pollen = 10;    //some methods omitted 

    public void anotherDay(){ 
     ArrayList<Bee> dead = new ArrayList<Bee>(); 
     int size = cells.size(); 

     for(int i = 0; i < size; i++) { 
      Bee bee = cells.get(i); 

      if ((bee = bee.anotherDay()) == null) { 
       dead.add(cells.get(i)); 
      } else { 
       cells.set(i, bee); 
      } 
     } 
     cells.removeAll(dead); 
    } 

Королева Класс: (не получить исключения нулевого указателя из метода едят в этом классе)

public class Queen extends Bee{ 

    Hive hive = null; 

    public Queen(){ 
    } 

    public Queen(Hive hive){ 
     this.hive = hive; 
     this.type = 1; 
     this.age = 11; 
     this.health = 3; 
    } 

    public Bee anotherDay(){ 
     eat(); 
     if (health == 0) { 
      return null; 
     } 
     age++; 
     if (age % 3 == 2) { 
      hive.addBee(new Egg()); 
     } 
     return this; 
    } 

    public boolean eat(){ 
     if(hive.honey >= 2) { 
      hive.takeHoney(2); 
      if(health < 3){ 
       health++; 
      } 
      return true; 
     } 
     health -= 1; 
     return false; 
    } 
} 

Работник класса пчелы: (получить NullPointerException- не знаю, почему)

public class Worker extends Bee { 

    Hive hive = null; 

    public Worker(){ 
     this.type = 2; 
     this.age=11; 
     this.health=3; 
    } 

    public Bee anotherDay(){ 
     eat(); 
     age++; 
     if (health == 0) { 
      return null; 
     } 
     return this; 
    } 

    public boolean eat(){ 
     if(hive.honey >= 1) { 
      hive.takeHoney(1); 
      if(health < 3){ 
       health++; 
      } 
      return true; 
     } 
     health -= 1; 
     return false;   
    } 
} 

Исключение:

Exception in thread "main" java.lang.NullPointerException 
    at Larvae.eat(Larvae.java:26) 
    at Larvae.anotherDay(Larvae.java:13) 
    at Hive.anotherDay(Hive.java:86) 
    at TestBasicHive.testpart4(TestBasicHive.java:381) 
    at TestBasicHive.main(TestBasicHive.java:13) 

Я добавляю элементы в arraylist, и код работает нормально до тех пор, пока не появятся личинки/рабочие или беспилотные летательные аппараты, и на них попытается использовать метод eat. Если я закомментируйте бит, который запускает метод съесть это будет работать нормально (но, очевидно, не делать то, что я хочу, чтобы это сделать)

Из ответов дал я попытался изменить конструктор в своем классе рабочий на:

public Worker(Hive hive){ 
    this.hive=hive; 
    this.type = 2; 
    this.age=11; 
    this.health=3; 
} 

public Worker(){} 

мне нужно «пустой» конструктор, как пчелы работника добавляется в улей из метода anotherDay в куколке, которая:

public Bee anotherDay(){ 
    age++; 
    if(age>10){ 
     return new Worker(); 
    }return this; 
} 

Это затем добавляет к ArrayList с помощью метода anotherDay в улье.

+1

Пожалуйста, добавьте исключение. – span

+1

'Hive hive = null;' является виновником в классе «Worker» – Nishant

+0

, исключение идентично для рабочего с личинками, замененным на Worker, и 26 заменено на 22 – user2973447

ответ

3

hive инициализирован до null и никогда не изменен в вашем классе Worker. Затем в методе eat вы пытаетесь получить доступ к полю.

+0

Как я могу это исправить? Я попытался изменить конструктор на: 'code'public Worker (Hive hive) {this.hive = hive; etc} 'code', но у меня есть еще один класс под названием pupa, который создает рабочих пчел, используя« code »new Worker(); 'code', поэтому мне нужен« пустой »конструктор, а затем он все еще не работает = ( – user2973447

+0

отредактируйте свой вопрос, вот так я не знаю, что вы имеете в виду, поскольку форматирование не работает;) – Blub

+0

Я редактировал его =) Надеюсь, что там яснее - добавленная деталь находится в нижней части вопроса – user2973447

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