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; }
}
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);
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*!
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!
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?
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:
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
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!