Справка по ошибке нулевого указателя? - PullRequest
1 голос
/ 26 ноября 2011

Привет, я получаю нулевой указатель, где отмечен в процессе.Класс тестера находится внизу.Это происходит при попытке распечатать зоопарк.Кажется, имя «Животное животное» не задано, но я создал животных.

Возможно, я получаю доступ не к тому животному, которого я хочу, но как мне получить доступ к животным в списке?сделано (пожалуйста, не используйте ":" в параметре for)!я знаю, что это неправильно, но что-то вроде animal_list.printdetails?

 public class Zoo { 
    private Animal animal;  
    public int number_animals;//# animals allowed in zoo
    private List<Animal> animal_list;
    private String zoo_name;


public Zoo(String name){
    this.zoo_name = name;
    animal_list = new ArrayList<Animal>();
}

 public void addAnimal(Animal obj) {
        animal_list.add(obj);
 }
 public String toString(){
    String s = "In zoo " + zoo_name + " there are the following animals:\n";
    for (int i = 0; i < animal_list.size(); i++){
        s += animal.getName() + " who weighs " + animal.getWeight() + " kg.";//null pointer on this line why??? i have made an animal. How do I access this animals in the list (please no using the ":" in the for parameter)!
    }
    return s;
 }



public class Animal {

public String name;
public int weight;
private String food_type;
private int space_requirement;
private Zoo zoo;
private Animal animal;  

public Animal(String name, int weight){
    this.name = name;
    this.weight = weight;
}    
public String getName(){
    return this.name;
}
public int getWeight(){
    return this.weight;
}



public class Test {
public static void main(String[] args) {        
    Zoo diego = new Zoo("San Diego");
    Animal giffy = new Animal("Giffy", 950);
    Animal gunther = new Animal("Gunther", 950);    
    diego.addAnimal(giffy);
    diego.addAnimal(gunther);
    System.out.println(diego);

}

Ответы [ 5 ]

5 голосов
/ 26 ноября 2011
for (int i = 0; i < animal_list.size(); i++){
    s += animal.getName() + " who weighs " + animal.getWeight() + " kg.";
}

Поскольку вы не используете List, вы пытаетесь сослаться на поле animal в вашем Zoo (которое вы фактически нигде не используете). Вы должны получить свои Animal с вашего animal_list

for (int i = 0; i < animal_list.size(); i++){
    s += animal_list.get(i).getName() + " who weighs " + 
         animal_list.get(i).getWeight() + " kg.";
}

Обратите внимание, что вам действительно следует использовать StringBuilder здесь, а не создавать новые String объекты с операторами += и +:

public String toString() {
    StringBuilder s = new StringBuilder("In zoo "); 
    s.append(zoo_name).append(" there are the following animals:\n");
    for (int i = 0; i < animal_list.size(); i++){
        s.append(animal_list.get(i).getName());
        s.append(" who weighs ");
        s.append(animal_list.get(i).getWeight());
        s.append(" kg.\n");
    }
    return s.toString();
}

String являются неизменными в Java; Вы не можете изменить их. Когда вы объединяете их, используя += или +, вы фактически создаете новые String объекты и отбрасываете старые. Компилятор фактически оптимизирует это до StringBuilder, но хорошей практикой является не оставлять его компилятору.

Изменить, чтобы добавить: Если вы не знакомы, приведенный выше пример цепочка методов

Когда вы говорите что-то вроде:

String name = animal_list.get(i).getName();

Это эквивалент:

Animal a = animal_list.get(i);
String name = a.getName();
1 голос
/ 26 ноября 2011

Проблема в том, что у вас нет доступа к животным в вашем списке.Вы пытаетесь распечатать информацию о животном, которого вы объявили в классе зоопарка, но не создали его.Там у вас есть NullPointerException.

public String toString(){
  String s = "In zoo " + zoo_name + " there are the following animals:\n";
  for (Animal animal:animal_list){
    s += animal.getName() + " who weighs " + animal.getWeight() + " kg.";//null pointer on this line why??? i have made an animal. How do I access this animals in the list (please no using the ":" in the for parameter)!
  }
 return s;
 }
1 голос
/ 26 ноября 2011

Ваш цикл здесь:

for (int i = 0; i < animal_list.size(); i++){
    s += animal.getName() + " who weighs " + animal.getWeight() + " kg.";
}

обращается к переменной члена animal, но вы никогда ничего не назначали этому члену. Вы, вероятно, хотите сделать:

for (int i = 0; i < animal_list.size(); i++){
    s += animal_list.get(i).getname() + " who weighs " + animal_list.get(i).getWeight() + " kg.";
}

Это можно написать более идиоматически, используя для каждой конструкции как

 for (Animal a : animal_list){
    s += a.getName() + " who weighs " + a.getWeight() + " kg.";
}
1 голос
/ 26 ноября 2011

В методе toString() для класса Zoo вы вызываете getName() и getWeight() для животного объекта, который вы никогда не создаете.

Внутри цикла for вам нужно что-то вроде этого:

 public String toString(){
    String s = "In zoo " + zoo_name + " there are the following animals:\n";
    for (int i = 0; i < animal_list.size(); i++)
    {
        animal = animal_list.get(i); //changes: 
                                     //stores the animal object at index i 
                                     //in the animal variable
        s += animal.getName() + " who weighs " + animal.getWeight() 
          + " kg.";
    }
    return s;

}

Надеюсь, это поможет.

0 голосов
/ 26 ноября 2011

почему животное является атрибутом уровня класса? измените цикл на for(Animal animal: animal_list), и я думаю, что это должно исправить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...