java - 空指针错误帮助?

标签 java list class methods nullpointerexception

您好,我在进程中标记的地方得到了一个空指针。测试类在底部。尝试打印动物园时会发生这种情况。 好像是没有给“Animal animal”设置名字,但是我创造了动物。

它可能访问了我想要的错误动物,但是我如何访问我制作的列表中的动物(请不要在 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);

}

最佳答案

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

因为您没有使用 List,所以您试图引用 Zoo 中的 animal 字段(您没有t 实际上在任何地方使用)。您必须从 animal_list

中获取您的 Animal
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,但最好不要将其留给编译器。

编辑添加: 如果您不熟悉,以上是 method chaining 的示例

当你说这样的话时:

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

相当于:

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

关于java - 空指针错误帮助?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274485/

相关文章:

c++ - 如何编写返回仅存在于类中的类型的成员函数?

C++(非内置/类)静态成员

java - 使用 if 语句测试 JTextField 是否为整数

java - 如何在 RxJava2 中获取作为订阅者的主题的 Disposable

java - 如何在intellij上正确编译jnativehook?

C# 程序卡住在整数列表上

java - 在 Java 中从边和顶点绘制 map

python - 我需要一个以正整数 (n) 开头并返回 2 的幂列表的函数,从 2 开始

Java 访问变量

java - getResourceAsStream 方法之间的区别