-1

'u başlatırken bir NullPointerException atar Android geliştirmede yeniyim ve (şimdiye kadar sadece) etkinliğimde basit bir SharedPreferences oluşturmaya çalışıyorum. Ancak, her çalıştırmayı denediğimde, bildirim satırında değişken atadığım halde çalışma zamanında Null-Pointer Exception alıyorum. Benim tam iz:Android, SharedPreferences

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)  

ve kod ilgili bitleri:

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(); 

istisna sınıfında üçüncü satırında atılır. Bildirimlerin her türlü farklı kombinasyonunu denedim ve bulabildiğim kadar çok stackoverflow yayınına baktım ama hiçbir şey ütülemiyor. Herhangi bir yardım takdir edilecektir!

+0

'prefs' ve' editör' başlatmalarını 'onCreate()' konumuna getirin. –

cevap

1

Paylaşılan tercihleri ​​ayarlama kodunuz onCreate'dan önce çalışıyor. Tüm normal amaçlar için, onCreate'dan önce yalnızca değişkenler atanmalıdır. This.getSharedPreferences kelimesini söylediğinde, "bu" kelimesi etkinliğe atıfta bulunur, ancak onCreate henüz çağrılmamıştır (bu yüzden etkinlik henüz oluşturulmamıştır). Yani 'bu' boş bir nesneye atanıyor. Yani NullPointerException elde edilir.

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 genellikle kullanılan şeydir, gereksinimlere göre başka modlar da vardır. Yani lütfen sizin için neyin iyi olduğunu kontrol edin.

+0

Bu, yükümdeki hatalara neden olur ve onCreate dışındaki programın başka yerlerinde kaydetme yöntemlerini kullanır. SharedPreferences ve Editor nesnelerini parametre olarak iletmek kabul edilebilir mi? Herhangi bir öğreticide veya açıklamada hiç görmedim –

+0

@AndrewSzoke Sadece başlatmaları 'onCreate()' olarak değiştirin. Beyanı oldukları yerde bırak. –

+1

@MikeM. Bunu yaptığını düşünüyorum. Ya da en azından ilgisiz istisnalar alıyorum, bu yüzden programı derledim. Teşekkürler! –

İlgili konular