Nul Pointer Exception

Hallo,

ich programmiere gerade ein Prog und scheitere schon zu Beginn.
Habe eine Klasse mit Benutzeroberfläche (Auswahlen, Knöpfen, dies, das).
Beim Klicken auf den Knopf, soll sich ein neues Fenster (=neue Klasse) öffnen. Über die 2. Klasse greife ich jetzt auf eine Methode der Klasse zu und bekomme eine Null Pointer Exception.
etwa so:

Klasse1
hat eine Auswahl

public String yx()
{
return hatAuswahl.text();
}

Klasse2:
Klasse1 abc

schreibe abc.xy()

abc ist jetzt null. ich kann abc ja nicht einfach mit new erzeugen, denn ich will ja keine 2. Klasse1, sondern nur auf etwas aus Klasse1 zugreifen.

Wie kann ich das denn jetzt lösen??

Ich hoffe die Erklärung ist ausreichend, danke im Vorraus!!!

Prinzipiell:
Klasse2 sollte die Instanz von Klasse1, die sie erzeugt hat, nicht kennen. Du musst einen „MyEventListener“ und eine addMyEventListener()-Methode (removeMyEventListener() wäre vllt. auch ganz gut) in Klasse2 definieren. In Klasse1 wird mit klasse2instanz.addMyEventListener(…) nun ein EventListener gesetzt.

Bei dir reicht es wohl, wenn du in Klasse2 ein Feld vom Typ String machst und nach der Erzeugung in Klasse1 dieses auf this.xy() setzt.

class Klasse1 {
 private void something() {
 Klasse2 k2 = new Klasse2();
 k2.setXy(this.xy());
 k2.setVisible(true);
 }
 public String yx() {
 return hatAuswahl.text();
 }
}

class Klasse2 {
 private String xy;
 public string getXy() { return xy; }
 public void setXy(string value) { xy = value; }
}

Grüße, JasonDelife.

ich versuchs
Dankeschööön!

Ich als Newbie check irgentwie nichts mehr.
Hab nochmal ein Testprog erstellt, das meinen Fehler verdeutlicht.

Ich poste mal alle Klassen! DANKE SCHON MAL / MAL WIEDER

______________________________________________
public class SuMAnwendung extends EBAnwendung
{
// Objekte
public Textfeld hatTextfeld1;
private Knopf hatKnopf1;

// Attribute

public SuMAnwendung()
{
//Initialisierung der Oberklasse
super(811, 672);

hatTextfeld1 = new Textfeld(89, 185, 100, 25, „“);
// Ausrichtung
hatTextfeld1.setzeAusrichtung(Ausrichtung.LINKS);
hatKnopf1 = new Knopf(221, 185, 100, 25, „Knopf 1“);
hatKnopf1.setzeBearbeiterGeklickt(„hatKnopf1Geklickt“);
}

public String Textfeld()
{
return hatTextfeld1.inhaltAlsText();
}
public void hatKnopf1Geklickt()
{
einNotizzettel = new Notizzettel();
einNotizzettel.fuehreAus();
}

}
_________________________________________

public class Notizzettel
{
// Objekte
Bildschirm derBildschirm;
Stift meinStift;
SuMAnwendung a = new SuMAnwendung();

// Konstruktor
public Notizzettel()
{
derBildschirm = new Bildschirm(50,50);
meinStift = new Stift();
}

// Dienste
public void fuehreAus()
{
// Aktionsteil
meinStift.bewegeBis(10, 10);
meinStift.schreibeText(a.Textfeld());
}
}

Habe ich Unklarheiten in meiner Frage? Ist es euch zu doof auf dieses Problem eine Antwort zu posten? Sorry, aber ich komm wirklich nicht weiter und mir ist klar, dass jeder, der ein bisschen Java spricht meine Frage lächerlich findet, aber lasst mich doch nicht hängen *heul*! :stuck_out_tongue:

Habe ich Unklarheiten in meiner Frage?

Ja. Ich verstehe nämlich gerade nicht, wo in Deinen beiden Beispielen die NullPointerException auftritt. Vielleicht kannst Du das einmal hier posten.

Ist es euch zu doof auf dieses Problem eine Antwort zu posten?

Nein, aber es ist schwer zu verstehen, was Dein Problem ist weil Du keine exakte Fehlerbeschreibung gibst.

Na dann sagt es doch:

Caused by: java.lang.NullPointerException
at Notizzettel.fuehreAus(Notizzettel.java:26)
at SuMAnwendung.hatKnopf1Geklickt(SuMAnwendung.java:34)
… 31 more

das ist die Fehlermeldung. Das ist im Prinzip das gleiche, wie zu Beginn. Deshalb dachte ich, würde es verständlich sein. Ich greife von der einen Klasse aus auf ein Objekt in der anderen Klasse zu und bekomme die genannte Meldung.

Dieses Testprogramm soll folgendes machen:

Es öffnet sich ein Fenster mit einem Textfeld und einem Knopf.
Beim Klicken auf den Knopf soll sich ein neues Fenster (Klasse: Notizzettel) öffnen mit dem Inhalt aus dem Textfeld!

Hallo,

Caused by: java.lang.NullPointerException
at Notizzettel.fuehreAus(Notizzettel.java:26)
at SuMAnwendung.hatKnopf1Geklickt(SuMAnwendung.java:34)
… 31 more

das ist die Fehlermeldung.

Die passt aber nicht zu den von dir geposteten Klassen, die jeweils weniger als 26 bzw. 34 Zeilen haben und sich zudem nicht kompilieren lassen. Was steht den tatsächlich in den entsprechenden Zeilen, bzw. wie sehen die Klassen wirklich aus?

Gruß
Heavy

Caused by: java.lang.NullPointerException
at Notizzettel.fuehreAus(Notizzettel.java:26)
at SuMAnwendung.hatKnopf1Geklickt(SuMAnwendung.java:34)
… 31 more

Zusätzlich zu dem was Heavy sagt: Welches Objekt wird denn an der Stelle null?

Ja richtig. Ich habe sie gekürzt! Noch mal vollständig:

import sum.komponenten.*;
import sum.werkzeuge.*;
import sum.ereignis.*;
import sum.strukturen.*;

public class SuMAnwendung extends EBAnwendung
{
// Objekte
public Textfeld hatTextfeld1;
private Knopf hatKnopf1;
public Notizzettel einNotizzettel;

// Attribute

public SuMAnwendung()
{
//Initialisierung der Oberklasse
super(811, 672);

hatTextfeld1 = new Textfeld(89, 185, 100, 25, „“);
// Ausrichtung
hatTextfeld1.setzeAusrichtung(Ausrichtung.LINKS);
hatKnopf1 = new Knopf(221, 185, 100, 25, „Knopf 1“);
hatKnopf1.setzeBearbeiterGeklickt(„hatKnopf1Geklickt“);
}

public String Textfeld()
{
return hatTextfeld1.inhaltAlsText();
}
public void hatKnopf1Geklickt()
{
einNotizzettel = new Notizzettel();
einNotizzettel.fuehreAus();
}

}

und

import sum.kern.*;
/**
* @author
* @version
*/
public class Notizzettel
{
// Objekte
Bildschirm derBildschirm;
Stift meinStift;
SuMAnwendung a;

// Konstruktor
public Notizzettel()
{
derBildschirm = new Bildschirm(50,50);
meinStift = new Stift();
}

// Dienste
public void fuehreAus()
{
// Aktionsteil
meinStift.bewegeBis(10, 10);
meinStift.schreibeText(a.Textfeld());
}
}

Ja richtig. Ich habe sie gekürzt! Noch mal vollständig:

Pre-Tags erleichtern das Lesen von Quellcode ungemein, damit sieht deine Klasse Notizzettel wie folgt aus:

import sum.kern.\*;
/\*\*
\* @author
\* @version
\*/
public class Notizzettel
{
 // Objekte
 Bildschirm derBildschirm;
 Stift meinStift;
 SuMAnwendung a;

 // Konstruktor
 public Notizzettel()
 {
 derBildschirm = new Bildschirm(50,50);
 meinStift = new Stift();
 }

 // Dienste
 public void fuehreAus()
 {
 // Aktionsteil
 meinStift.bewegeBis(10, 10);
 meinStift.schreibeText(a.Textfeld());
 }
}

Die Variable a vom Typ SuMAnwendung wird nie initialisiert, führt daher in der Zeile

meinStift.schreibeText(a.Textfeld());

zur NullPointerException. In deinem Code vom 27.08. stand noch

SuMAnwendung a = new SuMAnwendung();

sonst wäre dass damals schon aufgefallen. Es ist nicht unbedingt zielführend den Quellcode der die Fehlermeldung verursacht abzuändern wenn Du Hilfe bei deinem Probelm erwartest.

Was da die beste Lösung ist kann ich dir nicht sagen, da ich nicht weiß was du genau machen willst, aber wenn ich es recht verstehe, willst du den String den die Methode Textfeld zurückgibt der meinStrift.schreibeText Methode übergeben, du könntest also die Methode wie folgt definieren

 public void fuehreAus(String text)
 {
 // Aktionsteil
 meinStift.bewegeBis(10, 10);
 meinStift.schreibeText(text);
 }

und die aufrufenden Klasse entsprechend anpassen

einNotizzettel.fuehreAus(Textfeld());

HTH
Heavy

Sorry ich habe ständig versucht etwas zu ändern um das Problem zu beheben! Aber meine Änderungen machten im Bezug auf die Fehlermeldungen eh keinen Unterschied!

Danke die Fehlermeldung ist verschwunden, das gewünschte Ergebnis habe ich aber nicht. Es taucht der Text aus dem Textfeld für eine Millisekunde auf dem 2. Bildschirm auf. Warum bleibt der nicht? So was kommt mir aus früheren Progs bekannt vor. Ich mach mich mal auf die Suche nach dem Fehler! Falls jemand auf Anhieb eine Antwort kennt, immer gerne!
Danke an Heavy!