7

それがことが判明:なぜアクティビティのコンストラクタのgetApplicationContext()がnullポインタ例外をスローしますか?いくつかの時間を過ごしたバグ狩りの後

public class MainActivity extends BaseActivity { // BaseActivity extends Activity 

    public MainActivity() { 
     super(); 
     getApplicationContext(); // NPE here 
    } 
} 

はなぜ?これはどこに文書化されていますか?
Froyo

+3

から

リンクは活動のコンストラクタを実装することはありません。 – CommonsWare

+0

@CommonsWare:実際には 'service'上にありました:Dいくつかの入力リンクとソースリンクを提供するために気をつけてください。とにかく、これはどこに文書化されていないはずですか? –

+0

まだフレームワークによってインスタンス化されていない値を取得しようとしています。だから、あなたは 'onCreate()'のようなメソッドを持っているので、これらの値を使うのが安全です。 – dmon

答えて

7

onCreateの終了を待ちます。

public class MainActivity extends BaseActivity { 

    public onCreate(Bundle savedInstanceState) { 
     super(savedInstanceState); 
     getApplicationContext(); //activity has a context now 
    } 
} 
+0

私の知るところは、 'getApplicationContext();' nullを返しますが、_throws_を返します。これは私の質問であり、おそらく問題に関するいくつかの理論です。 - 多くの人がこの文書の不足に陥っていると信じています - –

+0

Activityのソースコードを確認してください。私の推測では、コンテキストが呼び出され、NPEが生成されます。 – Snicolas

+0

コードへのリンクを投稿するのに気をつけますか? –

7

何が起こっているかの感覚を得るために。 アクティビティextends ContextThemeWrapperContextWrapper投稿者アクティビティは、getApplicationContext()を継承しています。 ContextWrapperimplements it as

@Override 
public Context getApplicationContext() { 
    return mBase.getApplicationContext(); // mBase is a Context 
} 

ContextWrapperonly public constructorである:ContextThemeWrapperwe have

public ContextWrapper(Context base) { 
    mBase = base; 
} 

public ContextThemeWrapper() { 
    super(null); 
} 

と明示的なコンストラクタにCONを定義しない活性は上記の構造体はActivityのコンストラクタ-boomの-mBase == nullと呼ばれます。 4.2.2_r1

関連する問題