-1

私はAndroid開発時に新しいので、私の(これまでのところのみ)アクティビティで単純なSharedPreferencesを作成しようとしています。しかし、私はそれを実行しようとするたびに、宣言行に変数を代入しても、実行時にNull-Pointer例外が発生します。私の完全なトレース:SharedPreferencesのインスタンス化時にAndroidがNullPointerExceptionをスローする

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{andyszoke.macrohub/andyszoke.macrohub.SetMacroManualActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2988) 
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3242) 
                 at android.app.ActivityThread.access$1000(ActivityThread.java:205) 
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695) 
                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                 at android.os.Looper.loop(Looper.java:145) 
                 at android.app.ActivityThread.main(ActivityThread.java:6895) 
                 at java.lang.reflect.Method.invoke(Native Method) 
                 at java.lang.reflect.Method.invoke(Method.java:372) 
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference 
                 at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:111) 
                 at andyszoke.macrohub.SetMacroManualActivity.<init>(SetMacroManualActivity.java:17) 
                 at java.lang.reflect.Constructor.newInstance(Native Method) 
                 at java.lang.Class.newInstance(Class.java:1690) 
                 at android.app.Instrumentation.newActivity(Instrumentation.java:1080) 
                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2978) 
                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3242)  
                 at android.app.ActivityThread.access$1000(ActivityThread.java:205)  
                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1695)  
                 at android.os.Handler.dispatchMessage(Handler.java:102)  
                 at android.os.Looper.loop(Looper.java:145)  
                 at android.app.ActivityThread.main(ActivityThread.java:6895)  
                 at java.lang.reflect.Method.invoke(Native Method)  
                 at java.lang.reflect.Method.invoke(Method.java:372)  
                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)  
                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)  

とコードの関連ビット:

package andyszoke.macrohub; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.app.WindowDecorActionBar; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class SetMacroManualActivity extends AppCompatActivity { 
    private static final String TAG = "myMessage"; 
    private static final String MY_PREF = "MyPreferences"; 
    SharedPreferences prefs = this.getSharedPreferences(MY_PREF, 0); 
    SharedPreferences.Editor editor = prefs.edit(); 

例外がクラスの3行目にスローされます。私はあらゆる種類の宣言の組み合わせを試してみましたが、見つけられたほど多くのスタックオーバーフローポストを見ましたが、何もそれをアイロンしていません。どんな助けもありがとう!

+0

'prefs'と' editor'初期化を 'onCreate()'に移動します。 –

答えて

1

共有設定を設定するためのコードは、onCreateの前に実行されています。通常の目的では、onCreateの前に変数のみを割り当てる必要があります。 this.getSharedPreferencesと言ったとき、単語 'this'はアクティビティを参照していますが、onCreateはまだ呼び出されていません(アクティビティがまだ形成されていません)。だから、「これはヌルオブジェクトに割り当てられています。したがって、NullPointerExceptionが取得されます。

public class SetMacroManualActivity extends AppCompatActivity { 
    private static final String TAG = "myMessage"; 
    private static final String MY_PREF = "MyPreferences"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
    super.onCreate(savedInstanceState); 
    // load the layout 
    setContentView(R.layout.filters); 
    SharedPreferences prefs = getSharedPreferences(MY_PREF, MODE_PRIVATE); 
    SharedPreferences.Editor editor = prefs.edit(); 

MODE_PRIVATEは、通常使用されるもので、要件に基づいて他のモードがあります。だから、あなたのために何が良いかを確認してください。

+0

これは、プログラム内の他の場所(onCreateの外)で、ロード時にエラーが発生し、メソッドを保存することが予測されます。単純にSharedPreferencesオブジェクトとEditorオブジェクトをパラメータとして渡すことは可能ですか?私はチュートリアルや解説でそれを見たことがありません –

+0

@AndrewSzoke単に初期化を 'onCreate()'に移してください。彼らがどこにあったか宣言を残す。 –

+1

@MikeM。私はそれをしたと思う。あるいは、少なくとも私は無関係な例外を取得しているので、プログラムをコンパイルしています。ありがとう! –

関連する問題