# java.lang.NullPointerException weiß nich warum



## Gast_User (27. Nov 2006)

hallo
ich versuche gerade ein bischen mit j2me "herumzuspielen" und möchte eigendlich "nur" eine textdatei einlesen und ausgeben sozusagen.
Hier mal mein code und darunter der fehler (NullPointerException)


```
package Text;

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;

public class Textreader extends MIDlet implements CommandListener {
   
    private Command exitCommand;
   
    private Command nextCommand;
   
    private Form form;
   
    private Display display;
   
    private byte[] text_temp;
   
    private int anfang = 50;
   
    private String temp;
   
    public void lesen() {
        InputStream is = this.getClass().getResourceAsStream("/text.txt");
        DataInputStream dis = new DataInputStream(is);
        try {
            dis.readFully(text_temp, 10, 10);
//            System.out.println(dis.);
            System.out.println(text_temp[1]);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
   
    public void textauslesen() {
        display = Display.getDisplay(this);
        form = new Form("Texte");
        exitCommand = new Command("Exit", Command.EXIT, 2);
        nextCommand = new Command("weiter", Command.OK, 3);
        form.addCommand(exitCommand);
        form.addCommand(nextCommand);
        form.setCommandListener(this);
    }
   
    protected void startApp() {
        textauslesen();
        display.setCurrent(form);
    }
   
    protected void pauseApp() {
    }
   
    protected void destroyApp(boolean arg0) {
    }
   
    public void commandAction(Command command, Displayable displayable) {
        if (command == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }
        if (command == nextCommand) {
            lesen();
        }
    }
}
```
einze zeile in dem code ist auskommentiert. die darüberliegende zeile wirft die exception.


```
java.lang.NullPointerException
        at java.io.DataInputStream.read(DataInputStream.java:80)
        at java.io.DataInputStream.readFully(+34)
        at Text.Textreader.lesen(Textreader.java:34)
        at Text.Textreader.commandAction(Textreader.java:69)
        at javax.microedition.lcdui.Display$DisplayAccessor.commandAction(+282)
        at javax.microedition.lcdui.Display$DisplayManagerImpl.commandAction(+10)
        at com.sun.midp.lcdui.DefaultEventHandler.commandEvent(+68)
        at com.sun.midp.lcdui.AutomatedEventHandler.commandEvent(+47)
        at com.sun.midp.lcdui.DefaultEventHandler$QueuedEventHandler.run(+250)
```


----------



## Beni (27. Nov 2006)

Du hast "text_temp" nie initialisiert, die Variable zeigt noch auf null. Irgendwo vor Zeile 34 musst du mal "text_temp = new ..." aufrufen.


----------



## Gast_User (27. Nov 2006)

hab ich jetzt gemacht geht immer noch nicht....


```
package Text;

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.midlet.MIDlet;

public class Textreader extends MIDlet implements CommandListener {
    
    private Command exitCommand;
    
    private Command nextCommand;
    
    private Form form;
    
    private Display display;
    
    private byte[] text_temp = new byte[5];
    
    private int anfang = 50;
    
    private char temp;
    
    public void lesen() {
        InputStream is = this.getClass().getResourceAsStream("/text.txt");
        DataInputStream dis = new DataInputStream(is);
        try {
            dis.readFully(text_temp, 10, 5);
            System.out.println(text_temp[2]);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    
    public void textauslesen() {
        display = Display.getDisplay(this);
        form = new Form("Texte");
        exitCommand = new Command("Exit", Command.EXIT, 2);
        nextCommand = new Command("weiter", Command.OK, 3);
        form.addCommand(exitCommand);
        form.addCommand(nextCommand);
        form.setCommandListener(this);
    }
    
    protected void startApp() {
        textauslesen();
        display.setCurrent(form);
    }
    
    protected void pauseApp() {
    }
    
    protected void destroyApp(boolean arg0) {
    }
    
    public void commandAction(Command command, Displayable displayable) {
        if (command == exitCommand) {
            destroyApp(false);
            notifyDestroyed();
        }
        if (command == nextCommand) {
            lesen();
        }
    }
}
```


----------



## SlaterB (27. Nov 2006)

eine NullpointerException wird doch wohl nicht mehr kommen, oder?
warum meldest du dann nicht die neue Fehlermeldung?

> dis.readFully(text_temp, 10, 5); 

was bedeuten deiner Meinung nach die beiden Paramter 10 und 5 am Ende?
schaue in die API wenn du das noch nicht weißt


----------



## Gast_User (28. Nov 2006)

laut api:

read(byte[] b, int off, int len)

    b - the buffer into which the data is read.
    off - the start offset of the data.
    len - the maximum number of bytes read.

da hab ich ja nix falsch gemacht. hab n byte array als speicher angegeben, einen integer wo er starten soll in der datei und wie viel byte er lesen soll... ist schon so gewollt...


----------



## Gast_User (28. Nov 2006)

habs nochmla so probiert klappt aber auch nicht...   


```
InputStream is = this.getClass().getResourceAsStream("text.txt");
        InputStreamReader reader = new InputStreamReader(is);
        try {
            reader.read(text_temp2);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        System.out.println(text_temp[2]);
```

als ausgabe bekomme ich immer 0


----------



## SlaterB (28. Nov 2006)

vielleicht ist die Datei nicht da?
obwohl, dann sollte wohl doch eine Exception auftreten, teste mal mit "ffkhksj.txt"

du liest die chars aber in text_temp2 ein und gibst dann text_temp aus,
das ist ein anderes Array 


-----------

> da hab ich ja nix falsch gemacht. hab n byte array als speicher angegeben, einen integer wo er starten 

du hast immer noch nicht die Fehlermeldung gepostet und das Startinteger bezieht sich auf das Array,
also 'schreibe 5 Bytes ins Array an Position 9-14'

insofern hast du alles falsch gemacht 

---------


hier mal ein Testprogramm, aber nur in J2SE:


```
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Test {

	public static void main(String[] args) throws Exception {

		InputStream is = Test.class.getResourceAsStream("Test.java");
		InputStreamReader reader = new InputStreamReader(is);
		System.out.println("available bytes: " + is.available());

		byte[] b = new byte[5];
		try {
			is.read(b);
		} catch (IOException ex) {
			ex.printStackTrace();
		}
		System.out.println("byte: " + b[2]+ " char: "+((char) b[2]));
		System.out.println("available bytes: " + is.available());

	}
}
```

Ausgabe:
available bytes: 872
byte: 112 char: p
available bytes: 867

die Anzahl der Bytes stimmt nicht ganz, hab noch bisschen Code entfernt,
das entscheidene ist, das überhaupt bytes da sind,
und das die Zahl um 5 sinkt, wenn man 5 ausliest,
kannst du das bei dir auch beobachten?
die eingelesene Datei ist die Datei selber als .java falls bei dir vorhanden,
ansonsten vielleicht die .class-Datei, die sollte auf jeden Fall an diesem Ort sein,

byte[2] ist das p aus 'import ..' am Anfang der Datei


----------



## Guest (28. Nov 2006)

SlaterB hat gesagt.:
			
		

> du liest die chars aber in text_temp2 ein und gibst dann text_temp aus,
> das ist ein anderes Array


...omg... üble leichtsinnsfehler... bin mal wieder :autsch: 



			
				SlaterB hat gesagt.:
			
		

> > da hab ich ja nix falsch gemacht. hab n byte array als speicher angegeben, einen integer wo er starten
> 
> du hast immer noch nicht die Fehlermeldung gepostet und das Startinteger bezieht sich auf das Array,
> also 'schreibe 5 Bytes ins Array an Position 9-14'
> ...



hatte gedacht des bezieht sich auf die datei, ich wollte nur die bestimmten stellen einlesen... aber des kann ich ja mit skip machen.


danke für dein testprogramm... habs bei mir jetzt zum laufen bekommen so wie ichs wollte...


----------

