2010-04-30 126 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

相關問題