2016-08-11 3 views
0

私は自分のArrayAdapterクラスをWordAdapterという名前で定義しました。ここに私のコードですなぜgetContext()は動作しますが、コンストラクタを介して渡されたコンテキストが機能しないのですか?

Context context; 
int backgroundColor; 
private MediaPlayer mMediaPlayer = null; 

public WordAdapter(Context context, ArrayList<Word> words, int backgroundColor) { 
    super(context, R.layout.list_item, words); 
    this.context = context; 
    this.backgroundColor = backgroundColor; 
} 

private AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); 

上記のコードは、Null Pointer Exceptionを生成します。

しかし、このコードではありません:

Context context; 
int backgroundColor; 
private MediaPlayer mMediaPlayer = null; 

public WordAdapter(Context context, ArrayList<Word> words, int backgroundColor) { 
    super(context, R.layout.list_item, words); 
    this.context = context; 
    this.backgroundColor = backgroundColor; 
} 

private AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); 

なぜコンストラクタを通過したコンテキストが動作しませんか? WordAdapterwordsWordクラスアイテムのArrayListにあるようitemsAdapterが宣言され

itemsAdapter = new WordAdapter(this, words, R.color.category_numbers); 

EDITは、私はそれの一つが以下に与えられる、様々な活動でそれを呼び出します。

+1

plzはあなたがコンストラクタ – has19

+3

移動 'audioManager =(AudioManager)context.getSystemService(Context.AUDIO_SERVICE)を呼び出しているところ私たちを見る;'ρяσѕρєя[email protected]方法 –

+0

の内側に私はグローバル変数として定義されたコンテキストを。あなたの方法がうまくいかない理由(答えとして)を教えてください。 –

答えて

1

prosperKさんのコメントによると、同時に変数を作成して初期化することです。これは、audioManager変数を作成したときにコンテキストがまだnullであることを意味します。

コンテキストが実際に値を持つ場合は、contructorでaudioManagerを初期化してください。

+0

しかし、グローバル変数として 'context'を持っています。その値はローカル変数' context'に等しく設定されています。なぜグローバルな 'context'の値がnullになるのでしょうか? –

+1

グローバル変数は、値を指定しない限り、nullのままです。値はコンストラクタで与えられます。だから、コンストラクタは、そのヌルと呼ばれていない限り。事実、あなたのグローバル変数はcontextとaudioManagerが同時に作成され、同じヌルコンテキストを使ってaudioManagerを初期化しています –

+0

ありがとうございます。とった :) –

1

コンストラクタ内のaudioManagerを初期化します。

2

フィールドは、コンストラクターが実行される前にデフォルト値に初期化されるためです。 audioManagerフィールドの初期化は、コンストラクタでのみ初期化されるcontextに依存します。

コンストラクタの引数に依存する場合は、audioManager初期化をコンストラクタに移動する必要があります。

どうやらあなたgetContext()は、フィールドの初期化フェーズで有効ですContextを返します。

も参照してください:Are fields initialized before constructor code is run in Java?