NullPointerException因为覆盖了函数而被超类调用

时间:2015-01-11 05:08:05

标签: java

以下设置:

public class Superclass
{
    private String params;

    public Superclass(String params)
    {
        this.params = params;
        doStuff();
    }

    public void doStuff()
    {
        // uninteresting stuff
    }
}

public class Subclass extends Superclass
{
    private Object someObject;

    public Subclass(String params, Object someObject)
    {
        super(params);
        this.someObject = someObject;
    }

    @Override
    public void doStuff()
    {
        someObject.toString(); // <- causes NullPointerException
    }
}

Superclass创建用户界面,而Subclass应创建更专业的版本。

从软件工程的角度来看,阻止NullPointerException而“子类”的最简洁方法仍然是“超类”?

2 个答案:

答案 0 :(得分:2)

父类在施工时有 no 明显的理由来调用doStuff

简单地说,不要把电话放在那里。这些类应该彼此独立地构建。父类不应依赖子进程中的任何数据来完成其构造;在父构造函数中调用的子窗口重写的任何方法都将引入此依赖关系。

如果你发现你需要在父母中调用一个额外的方法,你可以制作一个final方法,不会发生任何不良影响,因为孩子不会&#39 ; t可以访问该方法。

public class Superclass {
    private String params;

    public Superclass(String params) {
        this.params = params;
        doStuffParent();
    }

    public final void doStuffParent() {
        // uninteresting stuff
    }

    public void doStuff() {
        // uninteresting stuff...again?
    }
}

答案 1 :(得分:0)

从软件工程的角度来看,您正在尝试对尚未构造的对象执行操作。将这个想法映射到你的真正的类和它的工作,你会明白超类构造函数存在一些问题,因为它试图处理处于错误状态的对象。

话虽如此,你有几个选择。

  • 如果有意义,请尝试将Object someObject传递给超类。可能超级班真的需要它来工作。
  • 不要在超类构造函数中调用doStuff()。在两个构造函数之外明确地调用它甚至是有意义的。
  • 让扩展类的构造函数调用doStuff(..)