【问题标题】:NullPointerException when using inheritence使用继承时出现 NullPointerException
【发布时间】:2015-05-19 10:51:40
【问题描述】:

我有一个场景,可以通过以下玩具示例进行最佳说明。假设我有四个类:

public class Animal {
    public Animal(String a_name){
        this.name = a_name;
    }
    public String name;
}

public class Mammal extends Animal{
    public Mammal(String a_name, String a_nickname) {
        super(a_name);
        this.nick_name = a_nickname;
    }
    String nick_name;
}


public class Animal_Groomer{
    public Animal_Groomer(Animal an_animal){
        this.the_animal = an_animal;
    }
    public void print_name() {
        System.out.println(the_animal.name);
    }
    public Animal the_animal;
}

public class Mammal_Groomer extends Animal_Groomer{
    public Mammal_Groomer(Mammal a_mammal){
        super(a_mammal);
    }
    public void print_nickname(){
        System.out.println(the_animal.nick_name);
    }
    public Mammal the_animal;
}

现在如果我的主要程序是

Mammal a_mammal = new Mammal("Tiger", "Bob");
Mammal_Groomer MG = new Mammal_Groomer(a_mammal);
MG.print_name();
MG.print_nickname();

MG.print_name() 输出“Tiger”,但 MG.print_nickname() 给了我一个 java.lang.NullPointerException 异常。我有没有办法修复构造函数或 MG.print_nickname() 方法来打印昵称?谢谢。

【问题讨论】:

  • 继承就像辣椒味的啤酒。理论上听起来不错,但通常会导致比您预期的更多的问题。替代方案:组合。接口(实际上是完全抽象的基类)

标签: java inheritance


【解决方案1】:

你在Mammal_Groomer的构造函数中忘记了this.the_animal = a_mammal;。

【讨论】:

    【解决方案2】:

    您从未在Mammal_Groomer 中初始化the_animal,因此它是null 并在方法调用时抛出NullPointerException。你应该像这样在超级调用之后初始化它:

    public Mammal_Groomer(Mammal a_mammal){
        super(a_mammal);
        this.the_animal = a_mammal;
    }
    

    【讨论】:

      【解决方案3】:

      Mammal_Groomer 类的the_animal 没有引用任何Mammal 对象,导致 NULL 引用和 NullPointerException。

      【讨论】:

        【解决方案4】:

        在继承中,方法被覆盖,而字段和静态成员被隐藏/隐藏。

        所以如果你在 parent 中初始化一个字段,如果你在 child 中定义相同的字段,它不会对 child 产生任何影响,因为它会被遮蔽。

        您没有初始化隐藏您的父字段并具有值null 的子字段。您需要在子构造函数中单独初始化子类的成员。

        public Mammal_Groomer(Mammal a_mammal){
            super(a_mammal);
            this.the_animal = a_mammal;
        }
        

        阅读有关阴影/隐藏和覆盖的更多信息:Overriding vs Hiding Java - Confused

        【讨论】:

          猜你喜欢
          • 2012-08-10
          • 2016-05-15
          • 2013-12-29
          • 2013-12-19
          • 2022-01-19
          • 2013-04-13
          • 2014-11-11
          • 2012-07-23
          • 1970-01-01
          相关资源
          最近更新 更多