【问题标题】:Issue calling superclass method in subclass constructor在子类构造函数中调用超类方法
【发布时间】:2010-04-30 19:34:58
【问题描述】:

我得到一个 NullPointerException 在子类内部类构造函数中调用超类方法...这是怎么回事?


在我的应用程序的主类(Application 的子类)中,我有一个公共内部类,它只包含 3 个公共字符串对象。在父类中,我声明了该内部类的一个对象。

public class MainApplication extends Application {
    public class Data {
        public String x;
        public String y;
        public String z;
    }

    private Data data;

    MainApplication() {
        data = new Data()

        data.x = SuperClassMethod();
    }
}

在构造函数中实例化对象后,当我尝试使用超类方法在内部类中分配值时出现运行时错误。

知道这里有什么吗?子类构造函数中不能调用超类方法吗?

** 编辑 ** 原始问题是关于外部类构造函数中的内部类成员分配。原来问题在于在类的构造函数中调用超类方法。它给了我一个空指针异常。因此,问题发生了变化。

【问题讨论】:

  • 我的代码是我实际代码的粗略伪版本。分号不是问题。我没有编译错误。当我运行应用程序时,我会弹出一个 android 对话框,说“应用程序已意外停止。请重试。”在进一步调试时,我发现我正在做的一项任务是使用父类的方法并抛出 NullPointerException。不知道为什么在子类的构造函数中隐式调用超类构造函数时,对吧?
  • 这很奇怪,因为之前我使用超类方法注释掉该行时,它仍然崩溃。现在,当我只是将常量字符串分配给内部类成员时,这很好。奇数...
  • 如果超类构造函数有Npe,则必须先修复。让我们看看堆栈跟踪,我们可以知道它的全部内容。
  • 不幸的是(幸运的是)我已经解决了这个问题;我只是在新方法而不是构造函数中加载数据。回滚代码以获取堆栈跟踪的工作量太大。但是,“您必须先修复”是什么意思?
  • 原来我的提示是对的。

标签: java android constructor


【解决方案1】:

所以我添加了一个分号、一个空基类和一个主类。

class Application {
}

public class MainApplication extends Application {
    public class Data {
        public String x;
        public String y;
        public String z;
    }

    private Data data;

    MainApplication() {
        data = new Data();

        data.x = "String";
    }

    public static void main(String[] args) {
        new MainApplication();
    }
}

适合我!(虽然我没有 Android 平台。)

(分号是复制粘贴错误吗?还是这不是原始代码?)

【讨论】:

  • +1 和读心徽章,如果这是正确的答案。由于stormin986没有发布实际的错误(在这种情况下是:"Good program expected")我们不知道这是否是正确的答案。
  • 那些问题宁愿产生编译时错误。
【解决方案2】:

尝试让你的内部类static

public static class Data {

这样它就不会绑定到 MainApplication 实例。

更新

从您的评论看来,您的意思是,在构造对象的 Application 部分在调用其方法时未正确初始化。

调用从它们自己的构造函数构造的对象的方法可能会导致意外行为,因为在构造函数完成之前对象不会一致地初始化。也就是说,添加对超级构造函数的显式调用可能会修复您的依赖关系:

MainApplication() {
    super();

    data = new Data();

【讨论】:

  • -1 绑定到MainApplication 实例有什么问题,因为它是在MainApplication 构造函数中创建的,所以该实例确实存在(除非 Dalvik 以不同的方式工作,我不这么认为)
  • @Oscar,错误的是在构造函数中 MainApplication 没有完全构造,这意味着 Data 实例及其父对象之间的隐式引用仍然引用了一个对象可能不一致。有点像从构造函数中调用自己的方法。
  • mmhh 这不是 java 的工作方式。无论如何,这不是这里的问题:) 和平
  • 你说这不是 java 的工作方式(我也会这么想)......但是我在子类构造函数中调用超类方法时遇到了问题......我会买这个直到我得到更好的解释。
【解决方案3】:

Data 类等非静态内部类要求 MainApplication 的实例有效。在构造函数期间 MainApplication 未完全形成,因此无法使用。正如 rsp 所说,将 Data 设为静态应该可以解决这个问题。

【讨论】:

  • -1 由于他在外部类的构造函数内部实例化了内部类Data,因此该实例已经存在。这个答案具有误导性。
  • 一个实例在其构造函数完成之前不会被认为是完整的。即使它可以工作,做这里正在做的事情也是非常糟糕的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多