Android NullPointerException

S

SDcard

Gast
Hallo alle zusammen, ich programmiere seit einiger Zeit an einem Spiel für Android, aber immer wenn ich versuche meine App im Emulator zu starten, muss die Anwendung unerwartet beendet werden.
Wenn ich noch irgendwelche Codeschnipsel posten soll, schreibt es einfach.

Das Logcat:
Code:
02-06 14:55:34.792: E/AndroidRuntime(403): FATAL EXCEPTION: main
02-06 14:55:34.792: E/AndroidRuntime(403): java.lang.RuntimeException: Unable to start activity ComponentInfo{x.x.mutanten/x.x.mutanten.MainActivity}: java.lang.NullPointerException
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.os.Looper.loop(Looper.java:123)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread.main(ActivityThread.java:3683)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at java.lang.reflect.Method.invokeNative(Native Method)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at java.lang.reflect.Method.invoke(Method.java:507)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at dalvik.system.NativeStart.main(Native Method)
02-06 14:55:34.792: E/AndroidRuntime(403): Caused by: java.lang.NullPointerException
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.content.ContextWrapper.getResources(ContextWrapper.java:80)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at x.x.mutanten.Tools.initialize(Tools.java:33)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at x.x.mutanten.Tools.<init>(Tools.java:24)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at x.x.mutanten.Doktor.<init>(Doktor.java:22)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at x.x.mutanten.MainActivity.onCreate(MainActivity.java:34)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-06 14:55:34.792: E/AndroidRuntime(403): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
02-06 14:55:34.792: E/AndroidRuntime(403): 	... 11 more

Der betreffende Code (Tools)
Java:
public class Tools  extends Activity{
	//Instanzvariablen
	Resources res;
	SharedPreferences preferences;
	String name;
	int geld;
	String[] dna;
	String[] zellnamen;
	String[] saves;
	
	//Konstruktor
	public Tools(){
		initialize(); //FEHLER!
	}
	
	//Methoden
	void initialize(){
        dna = new String[3];
		zellnamen = new String[3];
		saves = new String[9];
		//saves.txt laden
		InputStream inputStream = getResources().openRawResource(R.raw.saves); //Fehler!!!
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		int i;
        try { //Datei laden
               i = inputStream.read();
               while (i != -1)
                  {
                   baos.write(i);
                   i = inputStream.read();
                  }
                  inputStream.close();
              } catch (IOException e) {
               e.printStackTrace();
              }
                              
        String save = baos.toString(); //Dateiinhalt teilen
        saves = save.split("\n");
		
        saves[0] = saves[0].substring(0,-1);
        saves[1] = saves[1].substring(0,-1);
        saves[2] = saves[2].substring(0,-1);
        saves[3] = saves[3].substring(0,-1);
        saves[4] = saves[4].substring(0,-1);
        saves[5] = saves[5].substring(0,-1);
        saves[6] = saves[6].substring(0,-1);
        saves[7] = saves[7].substring(0,-1);
        saves[8] = saves[8].substring(0,-1);
        
		name = saves[0];
		geld = Integer.parseInt(saves[1]);
		dna[0] = saves[2]; //Aktell im LAbor
		dna[1] = saves[3]; //in der Datebank
		dna[2] = saves[4]; //in der Datebank
		dna[3] = saves[5]; //in der Datebank
		
		zellnamen[0] = saves[6];
		zellnamen[1] = saves[7]; 
		zellnamen[2] = saves[8]; 
		zellnamen[3] = saves[9]; 
	}

Doktor:[JAVA=24]tools = new Tools();[/code]

MainActivity:[JAVA=34]spieler = new Doktor();[/code]

Manifest:[XML]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="x.x.mutanten"
android:versionCode="2"
android:versionName="Beta 0.21" >

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="9" />

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="x.x.mutanten.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="x.x.mutanten.Tools"></activity>
</application>

</manifest>[/XML]
 
T

Tomate_Salat

Gast
Vllt solltest du dir mal Tutorials dazu anschauen. Du missachtest hier komplett den Lifecycle. Ein guter Ausgangspunkt für eine App ist immer die [c]onCreate(Bundle)[/c]-Methode.
 
S

SDcard

Gast
Die App wird aber nicht in Tools gestartet. Brauch ich in Tools trotzdem eine oncreate Methode?
 
N

nillehammer

Gast
Du hast ja bereits sehr gut die Zeile eingekreist, in der der Fehler auftritt:
Java:
  InputStream inputStream = getResources().openRawResource(R.raw.saves); //Fehler!!!
NullpointerException heißt, dass eine Eigenschaft oder Methode auf etwas aufgerufen wird, was null ist. Was könnte in der obigen Zeile null sein und deswegen ein Aufruf darauf zur NullPointerExcetion führen?
1. getResources() könnte null liefern --> Aufruf von openRawResource nicht möglich. Da das eine Frameworkmethode ist, eher unwahrscheinlich. Aber es schadet nicht, sich die Resourcen in einer eigenen Variablen zu speichern und mal ein System.out.println zu machen.
2. openRawResource(...) erwartet offensichtlich einen Parameter, um damit was zu machen. Ist vielleicht der übergebene Parameter null? Wieder hilft hier Speichern in einer Variablen und System.out.println
3. Auf R wird die Eigenschaft raw ausgelesen. Klappt nur, wenn R nicht null ist. Obwohl R ist glaube ich eine Klasse in Android und raw ein static field? Dann kann R nicht null sein. Aber vielleicht das Feld "raw"? Wieder Variable uns System.out.println

Soweit klar, wie man der Ursache auf die Spur kommt?
 
T

Tomate_Salat

Gast
Trotzdem hat die Activity ihren Lifecycle. Das ist komplett egal, ob das die erste Activity ist, die der Benutzer zu Gesicht bekommt oder sonst eine.

@nillehammer: Ich tippe eher darauf, dass die activity zu dem Zeitpunkt noch nicht "created" wurde und somit keinen Zugriff auf die Resourcen hat -> Nullpointer.
 
S

SDcard

Gast
@Tomate_Salat Die Klasse wird nie aufgerufen, sie wird nur für das LAden der Arrays aus R.raw.saves verwendet... Brauch ich dann trotzdem onCreate??
@nillehammer Ich versuchs mal :D
Danke für die Hilfe!
 
T

Tomate_Salat

Gast
??? Du hast die Klasse Tools und die erbt von Activity - zudem steht sie als Activity in deiner Manifest. Ich gehe mal davon aus, du rufst die über ein Intent + startActivity auf. In dem Falle: ja, weil du zu früh sonst auf Resourcen zugreifen möchtest die du noch nicht hast.

Ist die Sachlage anderster, dann steig ich gerade nicht dahinter ???:L
 
N

nillehammer

Gast
Tomate_Salat hat gesagt.:
@nillehammer: Ich tippe eher darauf, dass die activity zu dem Zeitpunkt noch nicht "created" wurde und somit keinen Zugriff auf die Resourcen hat -> Nullpointer.
Mist, das war gleich mein erster Tipp, den ich aber als unwahrscheinlich angesehen habe... naja, kenne mich mit Android eh nicht aus. Weder als Nutzer noch als Entwickler ;)
 
S

SDcard

Gast
Tools erbt eigentlich nur von Activity um Zugriff auf die Ressourcen zu bekommen. Ich starte Tools auch ganz normal über den Konstruktor. Wie kann ich die Klasse so ändern das sie ihne das Erben von Activity auskommt und trotzdem auf die Ressourcen zugreifen kann?
Sorry wenn ich mich blöd anstelle...
 
T

Tomate_Salat

Gast
Dann kann es natürlich auch nicht gehen. Der richtige Weg wäre folgender:

1) Aufräumarbeiten:
- entferne die Vererbung von Activity
- entferne den Entsprechenden Activity-Eintrag zu Tools in der Manifest

2) Übergib an Tools im Konstruktor ein Objekt vom Typ Context (oder eben die Activity)
3) greife auf Resourcen mittels dem übergebenen Context drauf zu.
 
S

SDcard

Gast
Danke! Danke! Danke! Ihr habt mir so geholfen :D
Kann ich als Gast das Thema als erledigt markieren??
 

Neue Themen


Oben