# Dateien Speichern



## Battleju (24. Dez 2016)

Hi,
ich bin beim Programmieren mit Java noch sehr unerfahren. Ich versuche ein Spiel für Android zu programmieren. Dabei sollen Variablen gespeichert werden, um nach einem erneuten Starten der App nicht von vorne anfangen zu müssen. Jedoch schließt sich die App("App wurde leider beendet"). Mit dem Debugger komm folgender Fehler: 


> E/AndroidRuntime: FATAL EXCEPTION: main
> Process: ihack.battl.de.ihack, PID: 12863
> java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences$Editor.putInt(java.lang.String, int)' on a null object reference
> at ihack.battl.de.ihack.Start.speichern(Start.java:141)
> ...


Ich überlege nun seit Stunden und finde die Ursache nicht...
Ich hoffe ihr könnt mir helfen.
Kompletter Soure code:
(1. class)

```
package ihack.battl.de.ihack;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class Start extends AppCompatActivity implements OnClickListener {
      Button boption1,boption2,hilfe;
      static SharedPreferences speicher;
      static Editor editor;

    static int savewert=0;
    static int test;
    static float bitstart,syslvl,kdollar,dollarmulti,score,bitcoin,przwert,grakawert;
    static float prz,twertgegner,twertspieler,adwertspieler,swertspieler,x,option1z,option2,option2_1,option3,option4,swertgegner1,twertgegner1,adwertgegner1,gdollar1,score1,escore1,swertgegner2,twertgegner2,adwertgegner2,gdollar2,score2,escore2,swertgegner3,twertgegner3,adwertgegner3,gdollar3,score3,escore3;
    static int przmulti,agswwert,prgswwert;
    static int preis1,preis2,preis3,preis4;
    static long psccode,altpsccode;
    static float angpsccode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        boption1= (Button)findViewById(R.id.bNeuesSpiel);
        boption2= (Button)findViewById(R.id.bSpielLaden);
        hilfe = (Button)findViewById(R.id.bHilfe);


        boption1.setOnClickListener(this);
        boption2.setOnClickListener(this);
        hilfe.setOnClickListener(this);

        speicher = getApplicationContext().getSharedPreferences("Wert",0);
        if(1 == savewert){
            editor.putInt("Data1",preis1);
            editor.commit();
            editor.putInt("Data2",preis2);
            editor.commit();
            editor.putInt("Data3",preis3);
            editor.commit();
            editor.putInt("Data4",preis4);
            editor.commit();
            editor.putFloat("Data5",x);
            editor.commit();
            editor.putFloat("Data6",bitstart);
            editor.commit();
            editor.putFloat("Data7",syslvl);
            editor.commit();
            editor.putFloat("Data8",kdollar);
            editor.commit();
            editor.putFloat("Data9",dollarmulti);
            editor.commit();
            editor.putFloat("Data10",score);
            editor.commit();
            editor.putFloat("Data11",bitcoin);
            editor.commit();
            editor.putFloat("Data12",przwert);
            editor.commit();
            editor.putFloat("Data13",grakawert);
            editor.commit();
            editor.putInt("Data14",przmulti);
            editor.commit();
            editor.putInt("Data15",agswwert);
            editor.commit();
            editor.putInt("Data16",prgswwert);
            editor.commit();
            editor.putLong("Data17",psccode);
            editor.commit();
            editor.putLong("Data18",altpsccode);
            editor.commit();
            editor.putInt("TestData",test);
            editor.commit();
            Toast.makeText(this, "Spielstand gespeichert",Toast.LENGTH_LONG).show();
        }
    }

    public void onClick(View e){
        int eingabe = e.getId();
        if(eingabe==R.id.bNeuesSpiel){
            test= 1;
            preis1=2;
            preis2=3;
            preis3=1;
            preis4=1;
            przwert= (float) 0.1;
            przmulti=1;
            agswwert=1;
            prgswwert=1;
            grakawert=150;
            dollarmulti=1;
            x=1;
            syslvl=1;
            kdollar=100;
            score=0;
            bitstart=0;
            bitcoin=0;
            psccode=0;
            altpsccode=0;

            Intent intent = new Intent(Start.this, game.class);
            startActivity(intent);
        }
        if(eingabe==R.id.bSpielLaden) {
            if(speicher.getInt("TestData",0)!=0){
                speicher.getInt("Data1",preis1);
                speicher.getInt("Data2",preis2);
                speicher.getInt("Data3",preis3);
                speicher.getInt("Data4",preis4);
                speicher.getFloat("Data5",x);
                speicher.getFloat("Data6",bitstart);
                speicher.getFloat("Data7",syslvl);
                speicher.getFloat("Data8",kdollar);
                speicher.getFloat("Data9",dollarmulti);
                speicher.getFloat("Data10",score);
                speicher.getFloat("Data11",bitcoin);
                speicher.getFloat("Data12",przwert);
                speicher.getFloat("Data13",grakawert);
                speicher.getInt("Data14",przmulti);
                speicher.getInt("Data15",agswwert);
                speicher.getInt("Data16",prgswwert);
                speicher.getLong("Data17",psccode);
                speicher.getLong("Data18",altpsccode);
                Intent intent = new Intent(Start.this, game.class);
                startActivity(intent);
            }else{
                Toast.makeText(this, "Kein Spielstand vorhanden",Toast.LENGTH_LONG).show();
            }

        }

    }
    public static void speichern(){
        editor.putInt("Data1",preis1);
        editor.putInt("Data2",preis2);
        editor.putInt("Data3",preis3);
        editor.putInt("Data4",preis4);
        editor.putFloat("Data5",x);
        editor.putFloat("Data6",bitstart);
        editor.putFloat("Data7",syslvl);
        editor.putFloat("Data8",kdollar);
        editor.putFloat("Data9",dollarmulti);
        editor.putFloat("Data10",score);
        editor.putFloat("Data11",bitcoin);
        editor.putFloat("Data12",przwert);
        editor.putFloat("Data13",grakawert);
        editor.putInt("Data14",przmulti);
        editor.putInt("Data15",agswwert);
        editor.putInt("Data16",prgswwert);
        editor.putLong("Data17",psccode);
        editor.putLong("Data18",altpsccode);
        editor.putInt("TestData",test);
    }
```
(2. class)

```
package ihack.battl.de.ihack;


import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;


import static ihack.battl.de.ihack.Start.adwertspieler;
import static ihack.battl.de.ihack.Start.agswwert;
import static ihack.battl.de.ihack.Start.altpsccode;
import static ihack.battl.de.ihack.Start.bitcoin;
import static ihack.battl.de.ihack.Start.bitstart;
import static ihack.battl.de.ihack.Start.dollarmulti;
import static ihack.battl.de.ihack.Start.grakawert;
import static ihack.battl.de.ihack.Start.kdollar;
import static ihack.battl.de.ihack.Start.preis1;
import static ihack.battl.de.ihack.Start.preis2;
import static ihack.battl.de.ihack.Start.preis3;
import static ihack.battl.de.ihack.Start.preis4;
import static ihack.battl.de.ihack.Start.prgswwert;
import static ihack.battl.de.ihack.Start.prz;
import static ihack.battl.de.ihack.Start.przmulti;
import static ihack.battl.de.ihack.Start.przwert;
import static ihack.battl.de.ihack.Start.psccode;
import static ihack.battl.de.ihack.Start.score;
import static ihack.battl.de.ihack.Start.speichern;
import static ihack.battl.de.ihack.Start.swertspieler;
import static ihack.battl.de.ihack.Start.syslvl;
import static ihack.battl.de.ihack.Start.test;
import static ihack.battl.de.ihack.Start.twertspieler;
import static ihack.battl.de.ihack.Start.x;
import ihack.battl.de.ihack.Start;
public class game extends AppCompatActivity implements OnClickListener {

    Button b,bs;



    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        var();
        setContentView(R.layout.activity_game_menue);
        TextView textView = (TextView) findViewById(R.id.werte);
        textView.setText("Systemlevel: " + syslvl + "\nScanwert: " + swertspieler + "\nTrojanawert: " + twertspieler + "\nAdwarewert: " + adwertspieler + "\n" + kdollar + "Dollar im Besitz");
        b= (Button)findViewById(R.id.b);
        bs=(Button)findViewById(R.id.save);
        b.setOnClickListener(this);
        bs.setOnClickListener(this);


    }
    public void var(){
        kdollar= (float) (Math.round(100.0 * kdollar) / 100.0);
        if (bitstart==1)
        {
            bitcoin+=grakawert/100000;
        } // end of if bitminer

        prz=przwert*przmulti;
        swertspieler=agswwert+100+(syslvl*(prz/5));
        twertspieler=prgswwert+100+(syslvl*(prz/5));
        adwertspieler=prgswwert+100+(syslvl*(prz/5));
        syslvl= (swertspieler+twertspieler+adwertspieler)/3/100;
        syslvl = (float) (Math.round(syslvl*1)/1.0);
    }

    @Override
    public void onClick(View v) {
        int eingabe = v.getId();
        if(eingabe==R.id.b) {
            kdollar += 100;
            Intent intent = new Intent(game.this, game.class);
            startActivity(intent);
        }
        if(eingabe==R.id.save){
            speichern();
            Intent intent = new Intent(game.this, Start.class);
            startActivity(intent);

        }
    }
}
```
Dieses Game ist noch am Anfang. Dadurch könnten einige Befehle sinnlos wirken.


----------



## Robat (24. Dez 2016)

Hey 



Battleju hat gesagt.:


> Ich bin beim Programmieren mit Java noch sehr unerfahren. Ich versuche ein Spiel für Android zu programmieren



Das passt in der Regel nicht zusammen. Setze dich erstmal mit den Basics von Java auseinander und fang' dann an Apps zu programmieren. So wirst du einiges nicht verstehen was dort eigentlich im Hintergrund passiert.

Zu deinem Problem:

Ich nehme mal an, dass Zeile 141 folgende ist:

```
editor.putInt("Data1",preis1);
```

Du bekommst eine NPE, da du hier das erste mal versuchst auf ein Objekt zuzugreifen, was du nirgends initialisiert hast. 
Generell initialisierst du ein SharedPreferences.Editor so:


```
SharedPreferences sharedPref  = ...


SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(.., ..);
```

Das ganze musst du in deinen Code einfügen *bevor *du das erste mal editor.putInt() o.ä. Methoden aufrufst 

Gruß
Robert


----------



## Battleju (25. Dez 2016)

Danke, ich habe die Initialisierung gemacht. Ich habe es getestet und es funktioniert. Doch wenn ich die App neustarte, sind die Werte nicht mehr gespeichert. Habe ich etwas falsch gemacht oder habe ich die Erklärung zu dem Befehl das falsch verstanden?


----------



## walex (25. Dez 2016)

In der Methode speichern() fehlt am Ende noch das editor.commit(), oder besser editor.apply()
walex


----------



## Battleju (25. Dez 2016)

Hier nochmal mein überarbeiteter Source Code:

```
package ihack.battl.de.ihack;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class Start extends AppCompatActivity implements OnClickListener {
      Button boption1,boption2,hilfe;
      static SharedPreferences speicher;
      static Editor editor;

    static int savewert=0;
    static int test;
    static float bitstart,syslvl,kdollar,dollarmulti,score,bitcoin,przwert,grakawert;
    static float prz,twertgegner,twertspieler,adwertspieler,swertspieler,x,option1z,option2,option2_1,option3,option4,swertgegner1,twertgegner1,adwertgegner1,gdollar1,score1,escore1,swertgegner2,twertgegner2,adwertgegner2,gdollar2,score2,escore2,swertgegner3,twertgegner3,adwertgegner3,gdollar3,score3,escore3;
    static int przmulti,agswwert,prgswwert;
    static int preis1,preis2,preis3,preis4;
    static long psccode,altpsccode;
    static float angpsccode;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        boption1= (Button)findViewById(R.id.bNeuesSpiel);
        boption2= (Button)findViewById(R.id.bSpielLaden);
        hilfe = (Button)findViewById(R.id.bHilfe);


        boption1.setOnClickListener(this);
        boption2.setOnClickListener(this);
        hilfe.setOnClickListener(this);

        speicher = getApplicationContext().getSharedPreferences("Wert",0);
        editor = speicher.edit();

    }

    public void onClick(View e){
        int eingabe = e.getId();
        if(eingabe==R.id.bNeuesSpiel){
            test= 1;
            preis1=2;
            preis2=3;
            preis3=1;
            preis4=1;
            przwert= (float) 0.1;
            przmulti=1;
            agswwert=1;
            prgswwert=1;
            grakawert=150;
            dollarmulti=1;
            x=1;
            syslvl=1;
            kdollar=100;
            score=0;
            bitstart=0;
            bitcoin=0;
            psccode=0;
            altpsccode=0;

            Intent intent = new Intent(Start.this, game.class);
            startActivity(intent);
        }
        if(eingabe==R.id.bSpielLaden) {
            if(speicher.getInt("TestData",1)!=0){
                speicher.getInt("Data1",preis1);
                speicher.getInt("Data2",preis2);
                speicher.getInt("Data3",preis3);
                speicher.getInt("Data4",preis4);
                speicher.getFloat("Data5",x);
                speicher.getFloat("Data6",bitstart);
                speicher.getFloat("Data7",syslvl);
                speicher.getFloat("Data8",kdollar);
                speicher.getFloat("Data9",dollarmulti);
                speicher.getFloat("Data10",score);
                speicher.getFloat("Data11",bitcoin);
                speicher.getFloat("Data12",przwert);
                speicher.getFloat("Data13",grakawert);
                speicher.getInt("Data14",przmulti);
                speicher.getInt("Data15",agswwert);
                speicher.getInt("Data16",prgswwert);
                speicher.getLong("Data17",psccode);
                speicher.getLong("Data18",altpsccode);
                Intent intent = new Intent(Start.this, game.class);
                startActivity(intent);
            }else{
                Toast.makeText(this, "Kein Spielstand vorhanden",Toast.LENGTH_LONG).show();
            }

        }

    }
    public static void speichern(){
        editor.putInt("Data1",preis1);
        editor.apply();
        editor.putInt("Data2",preis2);
        editor.apply();
        editor.putInt("Data3",preis3);
        editor.apply();
        editor.putInt("Data4",preis4);
        editor.apply();
        editor.putFloat("Data5",x);
        editor.apply();
        editor.putFloat("Data6",bitstart);
        editor.apply();
        editor.putFloat("Data7",syslvl);
        editor.apply();
        editor.putFloat("Data8",kdollar);
        editor.apply();
        editor.putFloat("Data9",dollarmulti);
        editor.apply();
        editor.putFloat("Data10",score);
        editor.apply();
        editor.putFloat("Data11",bitcoin);
        editor.apply();
        editor.putFloat("Data12",przwert);
        editor.apply();
        editor.putFloat("Data13",grakawert);
        editor.apply();
        editor.putInt("Data14",przmulti);
        editor.apply();
        editor.putInt("Data15",agswwert);
        editor.apply();
        editor.putInt("Data16",prgswwert);
        editor.apply();
        editor.putLong("Data17",psccode);
        editor.apply();
        editor.putLong("Data18",altpsccode);
        editor.apply();
        editor.putInt("TestData",test);
        editor.apply();
    }

}
```


```
package ihack.battl.de.ihack;


import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.view.View.OnClickListener;


import static ihack.battl.de.ihack.Start.adwertspieler;
import static ihack.battl.de.ihack.Start.agswwert;
import static ihack.battl.de.ihack.Start.altpsccode;
import static ihack.battl.de.ihack.Start.bitcoin;
import static ihack.battl.de.ihack.Start.bitstart;
import static ihack.battl.de.ihack.Start.dollarmulti;
import static ihack.battl.de.ihack.Start.grakawert;
import static ihack.battl.de.ihack.Start.kdollar;
import static ihack.battl.de.ihack.Start.preis1;
import static ihack.battl.de.ihack.Start.preis2;
import static ihack.battl.de.ihack.Start.preis3;
import static ihack.battl.de.ihack.Start.preis4;
import static ihack.battl.de.ihack.Start.prgswwert;
import static ihack.battl.de.ihack.Start.prz;
import static ihack.battl.de.ihack.Start.przmulti;
import static ihack.battl.de.ihack.Start.przwert;
import static ihack.battl.de.ihack.Start.psccode;
import static ihack.battl.de.ihack.Start.score;
import static ihack.battl.de.ihack.Start.speichern;
import static ihack.battl.de.ihack.Start.swertspieler;
import static ihack.battl.de.ihack.Start.syslvl;
import static ihack.battl.de.ihack.Start.test;
import static ihack.battl.de.ihack.Start.twertspieler;
import static ihack.battl.de.ihack.Start.x;
import ihack.battl.de.ihack.Start;
public class game extends AppCompatActivity implements OnClickListener {

    Button b,bs;



    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        var();
        setContentView(R.layout.activity_game_menue);
        TextView textView = (TextView) findViewById(R.id.werte);
        textView.setText("Systemlevel: " + syslvl + "\nScanwert: " + swertspieler + "\nTrojanawert: " + twertspieler + "\nAdwarewert: " + adwertspieler + "\n" + kdollar + "Dollar im Besitz");
        b= (Button)findViewById(R.id.b);
        bs=(Button)findViewById(R.id.save);
        b.setOnClickListener(this);
        bs.setOnClickListener(this);


    }
    public void var(){
        kdollar= (float) (Math.round(100.0 * kdollar) / 100.0);
        if (bitstart==1)
        {
            bitcoin+=grakawert/100000;
        } // end of if bitminer

        prz=przwert*przmulti;
        swertspieler=agswwert+100+(syslvl*(prz/5));
        twertspieler=prgswwert+100+(syslvl*(prz/5));
        adwertspieler=prgswwert+100+(syslvl*(prz/5));
        syslvl= (swertspieler+twertspieler+adwertspieler)/3/100;
        syslvl = (float) (Math.round(syslvl*1)/1.0);
    }

    @Override
    public void onClick(View v) {
        int eingabe = v.getId();
        if(eingabe==R.id.b) {
            kdollar += 100;
            Intent intent = new Intent(game.this, game.class);
            startActivity(intent);
        }
        if(eingabe==R.id.save){
            speichern();
            Intent intent = new Intent(game.this, Start.class);
            startActivity(intent);
            test = 1;

        }
    }
}
```
Die App funktioniert, jedoch bleiben die Dateien nach einem Neustart der App nicht erhalten.


----------



## walex (25. Dez 2016)

Doch, doch, die Daten werden sicherlich gespeichert.
Aber Du solltest beim einlesen die Daten auch den Variablen zuweisen und nicht das Ergebnis ignorieren.
Bsp,
speicher.getInt("Data1",preis1) sollte eher heissen  
preis1 = speicher.getInt("Data1",2)
Die 2 ist der Default-Wert.
Walex


----------



## Battleju (25. Dez 2016)

Okay, danke. Ich habe es gemacht und jetzt funktioniert es.


----------

