2010-04-30 166 views
0

我得到一个NullPointerException在子类内部类构造函数中调用超类方法...什么是交易?问题在子类构造函数中调用超类方法


在我的应用程序的主类(应用的子类),我有一个只包含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(); 
    } 
} 

我实例构造函数中的对象后,我得到一个运行时错误,当我尝试用超类方法分配在内部类的值。

任何想法这里有什么?你不能在子类构造函数中调用超类方法吗?

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

+3

什么是错误? – OscarRyz 2010-04-30 19:37:11

+0

我的代码是我实际代码的粗糙版本。分号不是问题。我没有编译错误。当我运行应用程序时,出现一个android对话框,弹出“应用程序意外停止,请重试。”在进一步的调试中,我发现其中的一个任务是使用父类的方法并引发NullPointerException。不知道为什么当超类的构造函数在子类的构造函数中被隐式地称为FIRST时,对吧? – stormin986 2010-04-30 20:58:00

+0

然而,这很奇怪,因为之前当我使用超类方法注释掉该行时,它仍然崩溃。现在,当我只是给内部类成员分配常量字符串时,它很好。奇怪... – stormin986 2010-04-30 20:59:54

回答

0

试着让你的内部类static

public static class Data { 

这样,它不依赖于MainApplication实例。

更新

从您的评论看来,你的意思是物体在建的Application部分未正确初始化调用它的方法的时候。

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

MainApplication() { 
    super(); 

    data = new Data(); 
+0

-1绑定到MainApplication实例,因为它是在MainApplication构造函数中创建的,所以实例确实存在(除非Dalvik以不同的方式工作,我不这么认为) – OscarRyz 2010-04-30 20:16:39

+0

@Oscar,什么是错的是在构造函数中'MainApplication'没有完全构建,这意味着'Data'实例与其父对象之间的隐式引用仍然指向可能不一致的对象。有点像当你从构造函数中调用你自己的方法时。 – rsp 2010-05-01 06:27:09

+0

mmhh这不是java的工作原理。无论如何,这不是问题在这里:)和平 – OscarRyz 2010-05-01 13:51:17

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平台)。

(WAS分号复制和粘贴错误?还是这不是原来的代码?)

+0

+1和心灵读书徽章,如果这是正确的答案。由于stormin986没有发布实际的错误(在这种情况下,这将是:*“好程序员的预期”*),我们无法知道这是否是正确的答案。 – OscarRyz 2010-04-30 20:18:24

+0

这些问题宁愿产生编译时错误。 – BalusC 2010-05-01 15:55:04

0

非静态内部类如数据类需要MainApplication的一个实例才是有效的。在构造函数MainApplication没有完全形成,所以不能使用。正如rsp所说,使数据静态应该绕过这个问题。

+0

即将发布的代码确实有效。 – 2010-04-30 20:01:20

+0

-1由于他在外部类的构造函数中实例化内部类“Data”,因此该实例已存在。这个答案是误导性的。 – OscarRyz 2010-04-30 20:15:34

+0

实例在其构造函数完成之前不会被认为是完整的。即使可以开展工作,但在这里完成所做的工作也是非常糟糕的做法。 – DJClayworth 2010-05-03 14:03:01

相关问题