2016-04-28 5 views
-2

So halte ich die gleichen Fehler, egal wie oft ich versuche, meinen Code hier und da zu zwicken. Ich werde jedes bisschen Code veröffentlichen, der mit dem Fehler zu tun hat.Fehler, Null-Zeiger-Ausnahme für SharedPreferences

Ich werde keinen unnötigen Code hinzufügen. Wenn mein Code also nicht vollständig aussieht, dann weil ich ihn abgeschnitten habe, damit die Leute das Problem leichter diagnostizieren können!

First Class

schrieb ich !!! Error !!! nach dem Code, der laut meinem Protokoll die Ursache des Fehlers war.

SharedPreferences sf; 
SharedPreferences.Editor editor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
sf = getSharedPreferences("MyData", MODE_PRIVATE); 
checkCookie(); 
} 

//function for making sure there's data 
public void checkCookie() { 
     editor = sf.edit(); 
     if (sf.getInt("cookies", -1) == -1) { 
      editor.putInt("cookies", 0); 
     } 
    } 
//function for retrieving amount of cookies 
public int getCookies() 
    { 
     editor = sf.edit(); !!! Error here !!! 
     int x = sf.getInt("cookies", 0); 
     return x; 
    } 
//function for changing amount of cookies 
public void changeCookies(int x) 
    { 
     editor = sf.edit(); 
     editor.putInt("cookies", x); 
    } 

zweite Klasse

Ich habe !!! Error !!! bei dem zweiten Fehler gegeben, der im Grunde ist, was die Funktion mit dem Fehler darin aufruft.

//MyActivity is the first class 
MyActivity mCookie = new MyActivity(); 

//function for adding cookies 
public void cookieCalc(){ 
     if (Math.abs((5-(millis/1000))) <= 0.005) 
      mCookie.changeCookies(100 * CB); ... much more similar code 

//an if statement within a function which just calls the function getcookies and cookiecalc 
if (loop == 2){ 
cookieCalc(); 
myText.setText("= " + mCookie.getCookies()); !!! this calls the function which gives error !!! 
} 

Der Fehler ist zu 100% wegen SharedPreferences wie es bei normalen Variablen gearbeitet, aber ich brauchte die Variablen zu speichern und mir wurde gesagt, dies eine sehr einfache Methode, dies zu tun. Wenn das alles immer noch nicht genug ist und ich es Ihnen nicht erklären kann, dann werde ich meinen gesamten Code auf gitHub oder einer anderen Anzeigeplattform einfügen.

Fehlerprotokolle

04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences.edit()' on a null object reference 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at app.z0nen.slidemenu.MyActivity.changeCookies(MyActivity.java:74) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at app.z0nen.slidemenu.menu1_Fragment.cookieCalc(menu1_Fragment.java:75) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at app.z0nen.slidemenu.menu1_Fragment$1.onClick(menu1_Fragment.java:148) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.view.View.performClick(View.java:5242) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.widget.TextView.performClick(TextView.java:10571) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.view.View$PerformClick.run(View.java:21196) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:145) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:6938) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
04-27 21:11:46.258 26975-26975/app.z0nen.menu E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
+2

Die 'Activity' Klasse ist nicht dazu gedacht, die Basisklasse für alles zu sein, und Sie können eine' Activity' Unterklasse mit 'new' nicht instanziiert und es korrekt funktionieren. Zum einen wird 'onCreate()' nicht aufgerufen, was die Ursache für Ihre aktuelle NPE zu sein scheint. –

+0

onCreate ist auf der Hauptfunktion es, was meine App erstellt. Ich habe versucht, system.out.println zu machen, aber ich konnte es nirgends in meinem Code finden. Ich habe keine Aktivitätsunterklasse Ich habe gerade einen leeren Konstruktor erstellt und hatte ihn so, dass er nur Informationen von ihm erhalten kann. – TeenCoder

+0

Sie sollten einen Kontext zu Ihrem zweiten Klasse übergeben, keine nicht-verwalteten Aktivität erstellen –

Antwort

1

Sie sollten sich nicht von selbst Aktivitätsinstanz erstellen! Nur System sollte das tun.

Wenn Sie beispielsweise selbst erstellen, wird onCreate nie aufgerufen, da diese Instanz nicht durch Standard-Aktivitätszyklus gehen.

+0

Ich bin ein wenig verwirrt. weil ich keinen Syntaxfehler habe und es scheint, dass es richtig mit meiner Aktivitätsklasse kommunizieren kann. – TeenCoder

+0

Gibt es eine Möglichkeit, dass ich überprüfen kann, ob meine onCreate läuft? – TeenCoder

+0

Verwenden Sie die Protokollierung. Aber nichts ruft onCreate auf, wenn Sie eine Instanz der Aktivität selbst erstellen. Sein einfach nur Java dann –

0

nicht neue Instanz selbst. onCreate war br

+0

onCreate wurde überschrieben – MurphyBin

+2

Hallo MurphyBin. Sie können Ihre Antwort aktualisieren, indem Sie auf den Link "[Bearbeiten]" unter dem Beitrag klicken. Vielen Dank. – Pang

-1

Gelöst

SharedPreferences sf = this.getActivity() getSharedPreferences ("your_prefs", Activity.MODE_PRIVATE.);

, weil es in einem Fragment Klasse war, hatte ich this.getActivity() hinzuzufügen, und ich beendete auch Activity.MODE_PRIVATE Addition. Ich habe wahrscheinlich eine Null-Zeiger-Ausnahme erhalten, weil es keine Möglichkeit gab, auf meine Aktivitätsklasse zuzugreifen, weil Fragmente etwas anderes erweitern? Nur eine Vermutung von mir, bis jetzt funktioniert es immer noch nicht so wie ich es will, aber ich habe Abstürze verhindert. bearbeiten es funktionierte nicht, weil ich nicht editor.commit(); um die Änderungen zu speichern.

+1

Dies ist nicht die richtige Lösung. Wie von allen anderen hier hervorgehoben, sollten Sie die Aktivität nicht selbst instanziieren. –

+0

Der Fehler, den ich bekam, war eine Null-Zeiger-Ausnahme. Die Aktivität war eine dumme Sache, die ich tat, aber es verursachte nicht den Fehler. Bitte sag nicht einfach, dass meine Lösung falsch ist, wenn es meinen Code endlich funktioniert hat. Ich habe mindestens 20 Stunden damit verbracht, das Problem zu beheben. Ich bin nicht in Form oder in einer guten Form im Codieren. Das war nicht nur, dass ich faul bin. – TeenCoder