Woher kommt diese NullPointer Exception?

Hallo allerseits! =)

Ich habe ein ziemlich simples Programm erstellen wollen, bei dem ich eine nicht nachvollziehbare NullPointer Exception bekommen habe.

Ich habe das Script inklusive Fehlermeldung mal bei Photobucket hochgeladen, da ich hier nicht registriert bin bzw. keine Bilder hochladen kann(?).

Link: http://s720.photobucket.com/albums/ww208/hearts_on_f…

Die gezeigte Meldung erscheint erst beim Ausführen des Programms, der Compiler meldet zuvor keine Syntaxerror.

Falls es nützt, die Konsole gibt die Fehlermeldung…

java.lang.NullPointerException
at sum.kern.Stift.zeichneKreis(Stift.java:342)
at Testprogramm.main(Testprogramm.java:25)
at Testprogramm.(Testprogramm.java:16)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at bluej.runtime.ExecServer$3.run(ExecServer.java:835)

… aus, aber damit weiß ich nichts anzufangen.

Selbes Problem tritt auf, wenn ich die Methode hatStift.bewegeUm(i) benutze.

Ich bin noch mehr oder weniger neu im BlueJ-Bereich und bringe mir alles autodidaktisch bei. Deswegen habe ich niemanden zum ansprechen und bitte um Euer Verständnis.

Für Ratschläge oder Lösungen danke ich jetzt schon,
einen schönen Abend noch!
Dennis

Moin Dennis,

es geht aus Deinem Code irgendwie nicht hervor, wo genau der Fehler liegt.
Es muss also mit der Klasse Stift selbst zu tun haben.
Könntest Du einmal den Code der kompletten Stift-Klasse pasten,
z.B. auf www.pastebin.com?

Gruß,
Puni

Hey =)

Vielen Dank erstmal für die schnelle Antwort! Ich bin zumindest froh, dass ich keinen dusseligen Fehler gemacht habe.

Die Bibliothek habe ich heruntergeladen, eine Dokumentation von der Klasse „Stift“ kann ich dir zB. hierüber geben:

http://www.learn-line.nrw.de/angebote/oop/medio/sum/…

Wenn das nicht das richtige ist, müsstest du mir nochmal etwas genauer beschreiben, was dir (also mir ^^) helfen könnte.

Danke nochmals,
Dennis

Ich habe ein ziemlich simples Programm erstellen wollen, bei
dem ich eine nicht nachvollziehbare NullPointer Exception
bekommen habe.

Naja, dein Stift-Objekt ist null. Das kommt daher, daß Du im Konstruktor Deiner Testklasse ganz toll so ein Objekt instanziirst, aber diesen Konstruktor nirgends aufrufst.

Naja, dein Stift-Objekt ist null. Das kommt daher, daß Du im
Konstruktor Deiner Testklasse ganz toll so ein Objekt
instanziirst, aber diesen Konstruktor nirgends aufrufst.

Ich frag mich aber, warum die Exception erst bei .zeichneKreis() auftritt, und nicht bereits bei den vorher benutzten Methoden. Denn ich glaube, dass ich mit Deklaration, Instanzierung und Initialisierung beim Stift keine Fehler gemacht habe.

Ansonsten wäre ich dir sehr dankbar, wenn du mir vielleicht die richtige bzw. fehlende Programmzeile beispielhaft posten könntest, damit ich weiß was ich falsch mache.

Danke! =)
Dennis

Ich frag mich aber, warum die Exception erst bei
.zeichneKreis() auftritt, und nicht bereits bei den vorher
benutzten Methoden. Denn ich glaube, dass ich mit Deklaration,
Instanzierung und Initialisierung beim Stift keine Fehler
gemacht habe.

Das hängt davon ab, wie deine Stiftklasse gebaut ist. Vielleicht ist .runter() eine statische Methode. Da ich aber nicht hellsehen kann, weiß ich das nicht.

Ansonsten wäre ich dir sehr dankbar, wenn du mir vielleicht
die richtige bzw. fehlende Programmzeile beispielhaft posten
könntest, damit ich weiß was ich falsch mache.

Ein Objekt Deiner Testklasse in der main Methode erzeugen… ich verstehe auch nicht, warum Du die main Methode aus dem Konstruktor anstößt. Die main-Methode wird ausgeführt, wenn Du das Programm startest, nicht der Konstruktor. Auch hier empfehle ich ersteinmal GRUNDLEGENDE Kentnisse nachzulesen, wenn Dir dieser Unterschied nicht klar ist.

java.lang.NullPointerException
 at sum.kern.Stift.zeichneKreis(Stift.java:342)
 at Testprogramm.main(Testprogramm.java:25)
 at Testprogramm.(Testprogramm.java:16)
 ...

Laut StackTrace ist nicht das Stift Objekt null, sondern „irgendetwas“ in der Stiftklasse in Zeile 342, die wir leider nicht kennen.

Aus dem Stack Trace ist ersichtlich, dass der Konstruktor von Testprogramm aufgerufen wurde, und aus diesem die main-Methode (die übrigens keine „richtige“ main Methode ist, da weder statisch noch mit String-Array versehen).

Ins blaue hinein rate ich mal, dass dem Stift der Bildschirm fehlt, auf dem er zeichnen soll, dieser wird in deinem Code zwar initialisiert, wird aber nie verwendet und z.B. an den Stift übergeben.

Gruß
Heavy

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich weiss, ich weiss. du willst das wahrscheinlich gar nicht hören, ich sags dir aber trotzdem:
Du hast KEINEN Fehler gemacht!
Irgendwas stimmt mit der Version nicht, welche du herunter geladen hast. Ich habe deinen Code mal abgetippt, und bei mir ausprobiert. Es klappte alles ganz hervorragend! Aber die Zeile, auf welche deine Fehlermeldung verweist (Stift.java:342) existiert in der aktuellen Version gar nicht.

Lade dir doch mal die neueste Version unter
http://www.learnline.nrw.de/angebote/oop/medio/downl…
runter.

Hier ist mein Beispielprogramm. Ich habe eine main-Methode eingefügt, damit ich das Programm direkt testen kann. Ich glaube, bei BlueJ ist das nicht notwendig, da man dort ja direkt Objekte erstellen kann. Nichts anderes macht bei mir die neue main-Methode:

import sum.kern.Bildschirm;
import sum.kern.Stift;


public class Testprogramm {
 Stift hatStift;
 Bildschirm hatBild;

 public Testprogramm() {
 hatStift = new Stift();
 hatBild = new Bildschirm(400,300);
 hatStift.bewegeBis(200,150);
 this.main();
 }

 private void main() {
 for (int i = 0; i

Schöner wäre es übrigens, wenn deine Klasse eher so ausssehen würde:


    
    import sum.kern.Bildschirm;
    import sum.kern.Stift;
    
    
    public class Testprogramm {
     private Stift testStift;
    
     public Testprogramm() {
     init();
     this.maleSpirale();
     }
    
     private void init() {
     testStift = new Stift();
     new Bildschirm(400,300);
     testStift.bewegeBis(200,150);
     }
    
     private void maleSpirale() {
     for (int i = 0; i
    
    Der Bildschirm speichert seine eigene Instanz in einer eignen statischen Klassenvariable. Du brauchst keine extra Referenz auf diese Variable. Das ist ein fehlerhafter Gebrauch des Singleton Musters, was dich aber nicht kümmern braucht. :wink: