App stürzt ab, Out of Memory..

  • 16 Antworten
  • Letztes Antwortdatum
P

paxis

Fortgeschrittenes Mitglied
0
Hallo hier :),

Ich wollte euch mal fragen, warum meine App jetzt wieder abstürzt!

Ich habe meinen Code heute von:

Code:
private int zähler2;
    private String aktuellerText="";
    private LadenBildschirm lB=null;
    private TextView Anzeige;
     ArrayList<String> Geschichte1 = new ArrayList<String>();
        int[] Geschichte1B = new int[10000];
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spielbildschirm2);

        Bundle zielkorb = getIntent().getExtras();
        int zähler2 = zielkorb.getInt("datenpaket1");
    
        aktuellerText=zielkorb.getString("datenpaket");
    
     Geschichte1.add(0,"-1");
      Geschichte1B[0] = 0; 
     Geschichte1.add(1,"0");
     Geschichte1B[0] = 0; 
      Geschichte1.add(2,"1 Blub");
      Geschichte1B[0] = 0; 
      Geschichte1.add(3,"2");
      Geschichte1B[0] = 1; 
      Geschichte1.add(4,"1.1");
      Geschichte1B[0] = 0; 
      Geschichte1.add(5,"1.2");
      Geschichte1B[0] = 0; 
     //weitere Deklarationen vom Array



    Button Möglichkeit1=(Button) findViewById(R.id.bTerste);
    Möglichkeit1.setOnClickListener((OnClickListener) this);
    Button Möglichkeit2=(Button) findViewById(R.id.bTzweite);
    Möglichkeit2.setOnClickListener((OnClickListener) this);
    }
    
    public void onClick(View v) {
        // TODO Auto-generated method stub
         
        switch(v.getId()) {
        case R.id.bTerste:
            String aktTe= Anzeige.getText().toString();
            int aktin= Geschichte1.indexOf(aktTe);
            int newin= aktin+aktin;
            String newTe = Geschichte1.get(newin);
            Anzeige.setText(newTe);
            
                writeData2(newTe);
            
            break;
        case R.id.bTzweite:
            
            String aktTe2= Anzeige.getText().toString();
            int aktin2= Geschichte1.indexOf(aktTe2);
            int newin2= aktin2+aktin2+1;
            String newTe2 = Geschichte1.get(newin2);
            Anzeige.setText(newTe2);
        
            
            writeData2(newTe2);
            
            break;
    }

auf
Code:
private int zähler2;
    private String aktuellerText="";
    private LadenBildschirm lB;
    private TextView Anzeige;
     ArrayList<String> Geschichte1 = new ArrayList<String>();
        int[] Aktion = new int[10000];
        int[] Möglichkeiten = new int[10000];
        int[][] NeuerIndex= new int [10000][10000];
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spielbildschirm);

    
        Bundle zielkorb = getIntent().getExtras();
        int zähler2 = zielkorb.getInt("datenpaket");
    aktuellerText=zielkorb.getString("datenpaket");

        
    
    
     Geschichte1.add(0,"-1");
     Aktion[0]=0;
     Möglichkeiten[0]=0;
     NeuerIndex[0][0]=0;
     Geschichte1.add(1,"0");
     Aktion[1]=0;
     Möglichkeiten[1]=2;
     NeuerIndex[1][0]=0;
     NeuerIndex[1][1]=2;
     NeuerIndex[1][2]=3;
      Geschichte1.add(2,"1Blub");
      Aktion[2]=0;
      
         Möglichkeiten[2]=3;
         NeuerIndex[2][0]=0;
         NeuerIndex[2][1]=4;
         NeuerIndex[2][2]=5;
         NeuerIndex[2][3]=6;
         //weitere Deklarationen

Button Möglichkeit1=(Button) findViewById(R.id.bTerste);
    Möglichkeit1.setOnClickListener((OnClickListener) this);
    Button Möglichkeit2=(Button) findViewById(R.id.bTzweite);
    Möglichkeit2.setOnClickListener((OnClickListener) this);
    Button Möglichkeit3=(Button) findViewById(R.id.bTdritte);
    Möglichkeit3.setOnClickListener((OnClickListener) this);
    Button Möglichkeit4=(Button) findViewById(R.id.bTvierte);
    Möglichkeit4.setOnClickListener((OnClickListener) this);
    }
    
    public void onClick(View v) {
        // TODO Auto-generated method stub
        int System; 

        Button Möglichkeit1=(Button) findViewById(R.id.bTerste);
        Möglichkeit1.setOnClickListener((OnClickListener) this);
        Button Möglichkeit2=(Button) findViewById(R.id.bTzweite);
        Möglichkeit2.setOnClickListener((OnClickListener) this);
        Button Möglichkeit3=(Button) findViewById(R.id.bTdritte);
        Möglichkeit3.setOnClickListener((OnClickListener) this);
        Button Möglichkeit4=(Button) findViewById(R.id.bTvierte);
        Möglichkeit4.setOnClickListener((OnClickListener) this);
        switch(v.getId()) {
        case R.id.bTerste:
            
            
            
            String aktTe= Anzeige.getText().toString();
            int aktin= Geschichte1.indexOf(aktTe);
            
            int newin=  NeuerIndex[aktin][1];
            String newTe = Geschichte1.get(newin);
            Anzeige.setText(newTe);
            System=Möglichkeiten[aktin];
            
            Möglichkeit3.setVisibility(0);
            Möglichkeit4.setVisibility(0);
            
            if (System==2){
            Möglichkeit3.setVisibility(4);
            Möglichkeit4.setVisibility(4);
            }
            if (System==3){
                Möglichkeit4.setVisibility(4);
            }
        
                writeData1(newTe);


        
            break;
        case R.id.bTzweite:
         
            String aktTe2= Anzeige.getText().toString();
            int aktin2= Geschichte1.indexOf(aktTe2);
            
            int newin2=  NeuerIndex[aktin2][2];
            String newTe2 = Geschichte1.get(newin2);
            Anzeige.setText(newTe2);
            System=Möglichkeiten[aktin2];
            
            Möglichkeit3.setVisibility(0);
            Möglichkeit4.setVisibility(0);
            
            if (System==2){
            Möglichkeit3.setVisibility(4);
            Möglichkeit4.setVisibility(4);
            }
            if (System==3){
                Möglichkeit4.setVisibility(4);
            }
        
                writeData1(newTe2);

            break;
            
       case R.id.bTdritte:
           String aktTe3= Anzeige.getText().toString();
            int aktin3= Geschichte1.indexOf(aktTe3);
            
            int newin3=  NeuerIndex[aktin3][3];
            String newTe3 = Geschichte1.get(newin3);
            Anzeige.setText(newTe3);
            System=Möglichkeiten[aktin3];
            
            Möglichkeit3.setVisibility(0);
            Möglichkeit4.setVisibility(0);
            
            if (System==2){
            Möglichkeit3.setVisibility(4);
            Möglichkeit4.setVisibility(4);
            }
           if (System==3){
               Möglichkeit4.setVisibility(4);
           }
        
                writeData1(newTe3);

           
           break;
           
       case R.id.bTvierte:
           String aktTe4= Anzeige.getText().toString();
            int aktin4= Geschichte1.indexOf(aktTe4);
            
            int newin4=  NeuerIndex[aktin4][4];
            String newTe4 = Geschichte1.get(newin4);
            Anzeige.setText(newTe4);
            System=Möglichkeiten[aktin4];
            
            Möglichkeit3.setVisibility(0);
            Möglichkeit4.setVisibility(0);
            
            if (System==2){
            Möglichkeit3.setVisibility(4);
            Möglichkeit4.setVisibility(4);
            }
           if (System==3){
               Möglichkeit4.setVisibility(4);
           }
        
                writeData1(newTe4);

           break;
            
    }
}
erweitert.
Wie man sieht, nichts besonderes, aber dennoch stürtzt die App ab und es kommt folgender fehler:
Zur weiteren Info:
Das ist nicht die Start Activity, sondern sie wird mit einem Intent aufgerufen.!

Fehler:

Code:
07-14 09:57:00.182: E/AndroidRuntime(770): FATAL EXCEPTION: main
07-14 09:57:00.182: E/AndroidRuntime(770): java.lang.OutOfMemoryError
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.reflect.Array.createMultiArray(Native Method)
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.reflect.Array.newInstance(Array.java:335)
07-14 09:57:00.182: E/AndroidRuntime(770):     at de.devMik.textadventure.SpielBildschirm.<init>(SpielBildschirm.java:23)
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.Class.newInstanceImpl(Native Method)
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.Class.newInstance(Class.java:1319)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.os.Looper.loop(Looper.java:137)
07-14 09:57:00.182: E/AndroidRuntime(770):     at android.app.ActivityThread.main(ActivityThread.java:5041)
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.reflect.Method.invokeNative(Native Method)
07-14 09:57:00.182: E/AndroidRuntime(770):     at java.lang.reflect.Method.invoke(Method.java:511)
07-14 09:57:00.182: E/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-14 09:57:00.182: E/AndroidRuntime(770):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-14 09:57:00.182: E/AndroidRuntime(770):     at dalvik.system.NativeStart.main(Native Method)
Dem fehlercode nach müsste es etwas mit Out of Memory sein, mein Emulator hat aber schon einiges an RAM, aber ich denke nicht das da der Fehler liegt oder? Irgendwie habe ich die Arrays im Verdacht, habe ich neeinen Flüchtigkeitsfehler gemacht?

Hilfe bitte :D!
 
Mit deinem Array NeuerIndex reservierst du 10000 x 10000 x 4 Bytes = 400 MB.
Ich denke schon, das es daran liegt ;)
 
Ach stimmt, gibt es tipps, wenn ich aber ein so grosses Array benötige?
 
Hallo,

ohne jetzt wirklich stark nachzuforschen glaube ich, dass es an
int[][] NeuerIndex= new int [10000][10000];liegt.
Du initialisierst ein zwei dimensionales Array mit jeweils 10000 Stellen pro Dimension.
Das heißt, du hast 100 Millionen Stellen in denen ein Int mit 32 Bit reinpasst. Wenn ich mich nicht verrechnet habe sind das 3200 MB (grob) also du bräuchtest 3 GB Speicher.

Deine Variablennamen zeigen schon, dass du kein "eingefleischter" Javaprogrammierer bist.
Vielleicht findest du eine andere Datenstruktur, die besser passt als so ein großes Array.

Edit: Mist zu spät :)
 
Kardroid schrieb:
Hallo,

ohne jetzt wirklich stark nachzuforschen glaube ich, dass es an
int[][] NeuerIndex= new int [10000][10000];liegt.
Du initialisierst ein zwei dimensionales Array mit jeweils 10000 Stellen pro Dimension.
Das heißt, du hast 100 Millionen Stellen in denen ein Int mit 32 Bit reinpasst. Wenn ich mich nicht verrechnet habe sind das 3200 MB (grob) also du bräuchtest 3 GB Speicher.

Deine Variablennamen zeigen schon, dass du kein "eingefleischter" Javaprogrammierer bist.
Vielleicht findest du eine andere Datenstruktur, die besser passt als so ein großes Array.

Edit: Mist zu spät :)


Mit dem eingefleischter Javaprogrammiere hast du vollkommen Recht :D!

Was wäre denn empfehlenswert und zugleich einfach?

Wir bräuchten für unsere App nämlich durchaus viel Platz ...
 
Da ich nicht weiß, was seine App für Speicher braucht, kann ich dir auch nicht direkt helfen.

Vielleicht ist deine App auch technisch nicht möglich, wenn du 100 Millionen Stellen benötigst.

Du kannst auch ein eigenes Objekt erstellen, welches du in eine ArrayList reinpackst, dann kannst du es evtl. bei nicht gebrauchen wieder deallokieren.
 
Was genau hast du denn vor, dass du 100.000.000 verschiedene int werte speichern musst?
Wenn du bei einer solchen menge nicht genug Speicher hast (vermutlich auf den meisten Smartphones) hast du eigentlich nur die Möglichkeit, das ganze auf der Festplatte bzw dem Flashspeicher abzulegen und nach Bedarf auzulesen.

Vorallem füllst du deinen "neuen Index" ja per Hand, du schreibst da doch nicht ernsthaft so viele Einträge rein.

Ich würde als erstes mal statt dem Array eine Map benutzen, sollte die am Ende aber auch so groß werden passt das natürlich trotzdem nicht (aber die Map ist nicht von anfang an so groß).

Die einzige Alternative ist aber das ganze irgendwo in einer Datei zu speichern oder in einer Datenbank und dann die entsprechenden Daten an der Stelle wo du sie brauchst auszulesen.

Allerdings braucht die Datenbank auch dann ihre 400+ MB (Das müsste wenn ich richtig gerechnet habe der Speicherbedarf für dein riesen Array sein)
 
Hat sich erledigt, ich hab vergessen, dass ein Array von [10000][10] reichen müsste!
Aber wie kann ich die SPeichergröße berechnen? :D
 
relativ einfach:
ein int hat 32 Bit
1 byte = 8 Bit
32/8 = 4 byte.

ein int hat also 4 byte.

Du speicherst jetzt 10.000*10 int werte also jeweils 4 byte:
100.000* 4 = 400.000byte
jetzt geteilt durch 1000 (eigentlich 1024 aber mit tausend ist einfach)
400Kilobyte

Das wird nicht auf das byte genau stimmen da es evtl noch was overhead gibt.
Aber grob kann man das so aussrechnen.
 
400 Kilobyte wären also 0,4 MB?

Aber okay danke ;)!
 
Da wäre ich nochmal... :D

Jetzt geht es aber um etwas anderes:

Ich möchte nun eine Art Inventar speichern für ein Spiel welches ich mit Freunden entwickle!
Das ganze soll in einem .txt Dokument gespeichert werden.
Die Klasse dazu sieht folgendermaßen aus:
Code:
package de.devMik.textadventure;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Inventar {

    
 public void Inventarcreate(){
     int Leben=100;
     int Angriff=10;
     int Deff=10;
     int Lebenstränke=1;
     
     try {
         File myFile = new File("/sdcard/savegame.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
    
    OutputStreamWriter myOutWriter = 
                            new OutputStreamWriter(fOut);
    myOutWriter.append(Leben + "\n");//Leben
    myOutWriter.append(Angriff + "\n");//Angriff
    myOutWriter.append(Deff + "\n");//Deff
    myOutWriter.append(Lebenstränke + "\n");//Lebenstränke
    
    myOutWriter.close();
    fOut.close();} catch (Exception e) {}
    
     
 }
    
    public int InventarLeben(){
         int Leben = 0;
         int Angriff;
         int Deff;
         int Lebenstränke;
        try {
            File myFile = new File("/sdcard/savegame.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            /*while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }*/
            for(int i= 0; i<6; i++){
                if(i == 0){
                    Leben = Integer.parseInt(myReader.readLine());
                }
                if(i == 1){
                    Angriff = Integer.parseInt(myReader.readLine());
                }
                if(i == 2){
                    Deff= Integer.parseInt(myReader.readLine());
                }
                if(i == 3){
                    Lebenstränke =Integer.parseInt(myReader.readLine());
                }
                
            }
            myReader.close();
            
            
        } catch (Exception e) {
            
        }
        return Leben;
    
    
}
    
    public int InventarAngriff(){
         int Leben = 0;
         int Angriff=0;
         int Deff;
         int Lebenstränke;
        try {
            File myFile = new File("/sdcard/savegame.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            /*while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }*/
            for(int i= 0; i<6; i++){
                if(i == 0){
                    Leben = Integer.parseInt(myReader.readLine());
                }
                if(i == 1){
                    Angriff = Integer.parseInt(myReader.readLine());
                }
                if(i == 2){
                    Deff= Integer.parseInt(myReader.readLine());
                }
                if(i == 3){
                    Lebenstränke =Integer.parseInt(myReader.readLine());
                }
                
            }
            myReader.close();
            
            
        } catch (Exception e) {
            
        }
        return Angriff;
    
    
}
    public int InventarDeff(){
         int Leben = 0;
         int Angriff;
         int Deff=0;
         int Lebenstränke;
        try {
            File myFile = new File("/sdcard/savegame.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            /*while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }*/
            for(int i= 0; i<6; i++){
                if(i == 0){
                    Leben = Integer.parseInt(myReader.readLine());
                }
                if(i == 1){
                    Angriff = Integer.parseInt(myReader.readLine());
                }
                if(i == 2){
                    Deff= Integer.parseInt(myReader.readLine());
                }
                if(i == 3){
                    Lebenstränke =Integer.parseInt(myReader.readLine());
                }
                
            }
            myReader.close();
            
            
        } catch (Exception e) {
            
        }
        return Deff;
    
    
}
    public int InventarLebenstränke(){
         int Leben = 0;
         int Angriff;
         int Deff;
         int Lebenstränke = 0;
        try {
            File myFile = new File("/sdcard/savegame.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            /*while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }*/
            for(int i= 0; i<6; i++){
                if(i == 0){
                    Leben = Integer.parseInt(myReader.readLine());
                }
                if(i == 1){
                    Angriff = Integer.parseInt(myReader.readLine());
                }
                if(i == 2){
                    Deff= Integer.parseInt(myReader.readLine());
                }
                if(i == 3){
                    Lebenstränke =Integer.parseInt(myReader.readLine());
                }
                
            }
            myReader.close();
            
            
        } catch (Exception e) {
            
        }
        return Lebenstränke;
    
    
}

 public void Lebenändern (int Leben){

     try {
            File myFile = new File("/sdcard/savegame.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
            OutputStreamWriter myOutWriter = 
                                    new OutputStreamWriter(fOut);
            myOutWriter.append(Leben + "\n");
            myOutWriter.append(InventarAngriff()+ "\n");
            myOutWriter.append(InventarDeff() + "\n");
            myOutWriter.append(InventarLebenstränke() + "\n");
            
            myOutWriter.close();
            fOut.close();
            
        } catch (Exception e) {
            
        }}
     

     public void Angriffändern (int Angriff){

         try {
                File myFile = new File("/sdcard/savegame.txt");
                myFile.createNewFile();
                FileOutputStream fOut = new FileOutputStream(myFile);
                OutputStreamWriter myOutWriter = 
                                        new OutputStreamWriter(fOut);
                myOutWriter.append(InventarLeben() + "\n");
                myOutWriter.append(Angriff+ "\n");
                myOutWriter.append(InventarDeff() + "\n");
                myOutWriter.append(InventarLebenstränke() + "\n");
                
                myOutWriter.close();
                fOut.close();
                
            } catch (Exception e) {
                
            }
     }

         public void Deffändern (int Deff){

             try {
                    File myFile = new File("/sdcard/savegame.txt");
                    myFile.createNewFile();
                    FileOutputStream fOut = new FileOutputStream(myFile);
                    OutputStreamWriter myOutWriter = 
                                            new OutputStreamWriter(fOut);
                    myOutWriter.append(InventarLeben() + "\n");
                    myOutWriter.append(InventarAngriff()+ "\n");
                    myOutWriter.append(Deff + "\n");
                    myOutWriter.append(InventarLebenstränke() + "\n");
                    
                    myOutWriter.close();
                    fOut.close();
                    
                } catch (Exception e) {
                    
                }
         }
         public void Lebenstränkeändern (int Lebenstränke){

             try {
                    File myFile = new File("/sdcard/savegame.txt");
                    myFile.createNewFile();
                    FileOutputStream fOut = new FileOutputStream(myFile);
                    OutputStreamWriter myOutWriter = 
                                            new OutputStreamWriter(fOut);
                    myOutWriter.append(InventarLeben() + "\n");
                    myOutWriter.append(InventarAngriff()+ "\n");
                    myOutWriter.append(InventarDeff() + "\n");
                    myOutWriter.append(Lebenstränke + "\n");
                    
                    myOutWriter.close();
                    fOut.close();
                    
                } catch (Exception e) {
                    
                } 
             
     
 }
 }
Jetzt wo es abstürtzt:
Code:
  case R.id.btInv:
           Inventar inv = new Inventar();
           int Leben= inv.InventarLeben();
           int Angriff = inv.InventarAngriff();
           int Deff = inv.InventarDeff();
           int Lebenstranke= inv.InventarLebenstränke();
           
           Intent intent3 = new Intent();
           Bundle inventar = new Bundle();
            inventar.putInt("datenpaket", Leben);
            inventar.putInt("datenpaket2", Angriff);
            inventar.putInt("datenpaket3", Deff);
            inventar.putInt("datenpaket4", Lebenstranke);
            intent3.putExtras(inventar);
            
            intent3.setClass(this, InventarBildschirm.class);
            startActivity(intent3);
break;
Das ganze soll folgendes starten:
Code:
package de.devMik.textadventure;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class InventarBildschirm extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.inventar); 
        Inventar inv = new Inventar();
      
        TextView TLeben= (TextView) findViewById(R.id.tVLeben);
        TextView TAngriff =(TextView) findViewById(R.id.tVAngriff);
        TextView TDeff = (TextView) findViewById(R.id.tVDeff);
        TextView TLebenstränke = (TextView) findViewById(R.id.tVLebenstraenke);
        Bundle zielkorb = getIntent().getExtras();
        int Leben = zielkorb.getInt("datenpaket");
        int Angriff = zielkorb.getInt("datenpaket2");
        int Deff= zielkorb.getInt("datenpaket3");
        int Lebenstranke = zielkorb.getInt("datenpaket4");
        TLeben.setText(Leben);
        TAngriff.setText(Angriff);
        TDeff.setText(Deff);
        TLebenstränke.setText(Lebenstranke);
        
}
    
}
Alles von der App funktioniert, nur dieses aufrufen nicht!

Zur Manifest datei:
Code:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
Permissions sind damit auch dabei.

Auch die Activity wurde eingetragen.
Code:
<activity
            android:name="de.devMik.textadventure.InventarBildschirm">
            
        </activity>
          <activity
            android:name="de.devMik.textadventure.Inventar">
            
        </activity>
fehlercode:
07-14 17:07:52.398: E/AndroidRuntime(818): FATAL EXCEPTION: main
07-14 17:07:52.398: E/AndroidRuntime(818): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.devMik.textadventure/de.devMik.textadventure.InventarBildschirm}: java.lang.NullPointerException
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread.access$600(ActivityThread.java:141)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.os.Handler.dispatchMessage(Handler.java:99)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.os.Looper.loop(Looper.java:137)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-14 17:07:52.398: E/AndroidRuntime(818): at java.lang.reflect.Method.invokeNative(Native Method)
07-14 17:07:52.398: E/AndroidRuntime(818): at java.lang.reflect.Method.invoke(Method.java:511)
07-14 17:07:52.398: E/AndroidRuntime(818): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-14 17:07:52.398: E/AndroidRuntime(818): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-14 17:07:52.398: E/AndroidRuntime(818): at dalvik.system.NativeStart.main(Native Method)
07-14 17:07:52.398: E/AndroidRuntime(818): Caused by: java.lang.NullPointerException
07-14 17:07:52.398: E/AndroidRuntime(818): at de.devMik.textadventure.InventarBildschirm.onCreate(InventarBildschirm.java:23)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.Activity.performCreate(Activity.java:5104)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
07-14 17:07:52.398: E/AndroidRuntime(818): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
07-14 17:07:52.398: E/AndroidRuntime(818): ... 11 more


Jemand ne Ahnung woran es liegt?
 
Zuletzt bearbeitet:
Daran:

Code:
07-14 17:07:52.398: E/AndroidRuntime(818):     at  de.devMik.textadventure.InventarBildschirm.onCreat   e(InventarBildschirm.java:23)
 
  • Danke
Reaktionen: paxis
danke schonmal, aber wieso ausgerechnet:
TLeben.setText(String.valueOf(Leben));???


Ist doch genauso wie die anderen....:
TextView TLeben= (TextView) findViewById(R.id.tVLeben);
TextView TAngriff =(TextView) findViewById(R.id.tVAngriff);
TAngriff.setText(String.valueOf(Angriff));


EDIT:

Was vielleicht gerade wesentlich interessanter wäre:

Warum bekomme ich hierbei:
Code:
 public void Inventarcreate(){
     int Leben=100;
     int Angriff=10;
     int Deff=10;
     int Lebenstränke=1;
     
     try {
         File myFile = new File("/sdcard/savegame.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
    
    OutputStreamWriter myOutWriter = 
                            new OutputStreamWriter(fOut);
    myOutWriter.append(Leben + "\n");//Leben
    myOutWriter.append(Angriff + "\n");//Angriff
    myOutWriter.append(Deff + "\n");//Deff
    myOutWriter.append(Lebenstränke + "\n");//Lebenstränke
    
    myOutWriter.close();
    fOut.close();
    } catch (Exception e) {}
    
     
 }
    
    public int InventarLeben(){
         int Leben1 = 0;
         int Angriff1;
         int Deff1;
         int Lebenstränke1;
        try {
            File myFile = new File("/sdcard/savegame.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            /*while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }*/
            for(int i= 0; i<6; i++){
                if(i == 0){
                    Leben1 = Integer.parseInt(myReader.readLine());
                }
                if(i == 1){
                    Angriff1 = Integer.parseInt(myReader.readLine());
                }
                if(i == 2){
                    Deff1= Integer.parseInt(myReader.readLine());
                }
                if(i == 3){
                    Lebenstränke1 =Integer.parseInt(myReader.readLine());
                }

}
            myReader.close();
            
            
        } catch (Exception e) {
            
        }
        return Leben1;

für Leben1 z.B. 0 zurück?

Klar ich deklariere es zuerst als 0, aber eigentlich müsste er das doch lesen oder?

Mache ich nämlich folgendes:
Code:
Inventar inv= new Inventar();
        inv.Inventarcreate();   
 int Leben6= inv.InventarLeben();
Anzeige.setText(String.valueOf(Leben6));
Kommt 0....

Warum? :(
Verzweifel gerade...:(


Edit:

Konnte gerade feststellen, dass er auf jeden Fall die richtigen Werte bei create speichert, nur ich verstehe nicht, warum er nicht die richtigen ausliest....
 
Zuletzt bearbeitet:
paxis schrieb:
} catch (Exception e) {

}

Du schluckst jede Exception. Ich bin mir ziemlich sicher, dass ein Fehler geschmissen wird, du ihn aber einfach schluckst und dadurch kommt die 0 raus.

Ich mache das auch oft, dass ich "learning by doing" mache, aber ein paar wichtige Grundlagen fehlen dir.
 
Ach geht mittlerweile aber danke!
Auch dir amfa für die Tipps!
 

Ähnliche Themen

G
Antworten
0
Aufrufe
106
Gerdchen07
G
G
Antworten
1
Aufrufe
365
Gerdchen07
G
G
Antworten
13
Aufrufe
578
Gerdchen07
G
L
Antworten
2
Aufrufe
471
Lexub
L
migi01
Antworten
26
Aufrufe
1.916
migi01
migi01
Zurück
Oben Unten