Erzeugte Objekte sind nicht bekannt

Arkain

Mitglied
Vll habe ich nur einen Dummen fehler ich weiß es nicht aber da ich schon seit 2 Tagen auf keien Lösung komme frage ich hier einfach mal nach.
Ich habe eine Dialogklasse die so eingeleitet wird:
Java:
public Übersicht(Account A1) {
        initComponents();
        txtName.setText(A1.getName());
    Hauptquartier HQ=new Hauptquartier();
    DBAnbindungHauptquartier DBAHQ=new DBAnbindungHauptquartier(HQ);
    Metallmine M1=new Metallmine();
    DBAnbindungMetallmine DBAM1=new DBAnbindungMetallmine(M1);
    Saegewerk S1=new Saegewerk();
    DBAnbindungSaegewerk DBAS1=new DBAnbindungSaegewerk(S1);
    Oelraffinerie Oe1=new Oelraffinerie();
    DBAnbindungOelraffinerie DBAOe1=new DBAnbindungOelraffinerie(Oe1);
    Muehle Mue1=new Muehle();
    DBAnbindungMuehle DBAMue1=new DBAnbindungMuehle(Mue1);
    RessourcenBestand ReB1=new RessourcenBestand();
    DBAnbindungRessourcenBestand DBAReB1=new DBAnbindungRessourcenBestand(ReB1);

    DBAReB1.dbAnbindung();
    DBAReB1.ZeigeRessourcenBestand(A1.getName());

    txtMetall.setText(Integer.toString(ReB1.getBestandMetall()));
    txtHolz.setText(Integer.toString(ReB1.getBestandHolz()));
    txtOel.setText(Integer.toString(ReB1.getBestandOel()));
    txtArbeiter.setText(Integer.toString(ReB1.getBestandArbeiter())); 

    DBAHQ.dbAnbindung();
    DBAHQ.ZeigeHauptquartier(A1.getName());
    DBAM1.dbAnbindung();
    DBAM1.ZeigeMetallmine(A1.getName());
    DBAS1.dbAnbindung();
    DBAS1.ZeigeSaegewerk(A1.getName());
    DBAOe1.dbAnbindung();
    DBAOe1.ZeigeOelraffinerie(A1.getName());
    DBAMue1.dbAnbindung();
    DBAMue1.ZeigeMuehle(A1.getName());

    txtStufeHauptquartier.setText(Integer.toString(HQ.getStufe()));
    txtStufeMetallmine.setText(Integer.toString(M1.getStufe()));
    txtStufeSaegewerk.setText(Integer.toString(S1.getStufe()));
    txtStufeOelraffinerie.setText(Integer.toString(Oe1.getStufe()));
    txtStufeMuehle.setText(Integer.toString(Mue1.getStufe()));
}

Hier erzeuge ich mehrere Objekte die aber dann nach diesen Konstruktor nichtmehr bekannt sind laut Netbeans. Die klassen sind alle vorhanden und es funktioniert auch das was hier steht. Aber wenn ich dann versuche diese Objekte durch klicken eines Bottums in eine andere Dialogklasse zu übergeben mittels
[Java]private GebaeudeDlg GebaeudeDlg;
GebaeudeDlg=new GebaeudeDlg(DBAHQ, DBAM1, DBAS1, DBAOe1, DBAMue1);
GebaeudeDlg.setVisible(true);[/Java]
Erkennt er all diese Objekte nichtmehr. Er emphielt mir im package diese Objekte zu erstellen...aber ich habe sie ja schon im Konstruktor da oben...Ich habe zuerst gedacht das man keine Objekte für eine Klasse im Konstruktor erzeugen kann und dann drauf zugreifen kann später in derselben Klasse. Da ich aber schon in einen anderen Projekt im Konstruktor ein Objekt erzeugt habe und dieses dann auch weiter verwendet habe und es gefunzt hat müssten doch die Objekte auch hier bekannt sein in der Klasse.
Bitte weißt mich auf meinen dummen Fehler hin es wäre sehr freundlich.

MfG
Arkain
 
Java:
public class Test {
    private int wichtig;

    public Test() {
        wichtig = 4;
        int nichtso = 3;
    }

    public void methode() {
        System.out.println(wichtig); // bekannt
        System.out.println(nichtso); // Fehler
    }
}
 
Man könnte auch eine Erklärung schreiben Slater..

Hallo Arkain,

das Problem ist, dass du die Variablen innerhalb einer Methode deklariert wird
Somit "existiert" diese Variable auch nur innerhalb dieser Methode(eine sogenannte Lokale Variable"). Außerhalb dieser Methode existiert diese Variable nicht mehr.

Willst du nun allerdings von einer anderen Methode auf diese Variable zugreifen, gibt es die möglichkeit eine "globale" variable zu erstellen. Der Unterschied hierbei ist, dass du sie nicht in einer Methode deklarierst, sondern nur innerhalb der Klasse.
Beispiel mit deinem Code:

Java:
public class TestKlasse{

   DBAnbindungHauptquartier DBAHQ;     //wird innerhalb der Klasse / außerhalb einer Methode  
                                                      //deklariert. 
                                                     //Ist für alle (nicht-statischen) Methoden  sichtbar
   
   public Übersicht(Account A1) {
        initComponents();
        txtName.setText(A1.getName());
        Hauptquartier HQ=new Hauptquartier();
        DBAHQ=new DBAnbindungHauptquartier(HQ);   //hier wird die "globale" Variable benutzt
   }

    public void andereMethode(){
        GebaeudeDlg=new GebaeudeDlg(DBAHQ);     //hier wird auch die "globale" Variable benutzt
        GebaeudeDlg.setVisible(true);
    }
}

PS: versuch Variablen immer mit kleinen Buchstaben zu schreiben. Wörter nur aus Großbuchstaben sind normalerweise Konstante.
 
danke ich wusste ich habe irgendwas vergessen aber das es sowas banales ist hab ich net gedacht normalerweise tu ich das imemr sofort nur ganz unten kurz vor der letzten Klammer(ist so weil wir in der Schule das so machen).
jetzt hab ich nur eine Frage noch...Wieso wird hier kein neues Fenster geöffnet:
Java:
private GebaeudeDlg GebaeudeDlg;
GebaeudeDlg=new GebaeudeDlg(DBAHQ, DBAM1, DBAS1, DBAOe1, DBAMue1);
GebaeudeDlg.setVisible(true);
Ich habe es zuvor auch gemacht aber halt nur ein Objekt mitübergeben, kann es daran liegen das ich schon 4 Dialogklassen sichtbar habe?
 
das kann sein, hilfreich wäre ein vollständiges Testprogramm, soweit wie möglich vereinfacht,
vielleicht reicht ja auch ein simples new JDialog() statt komplierter eigener Klassen mit noch komplizierteren Parametern
 
Nya ein neues Fenster sollte es schon sein geplant isgt aber auch das es eigentlich 3 fenster weniger sein sollten aber er nimtm den befehle .setVisibler(false) nicht an...ich weiß nur nicht wieso 🙁
Ihc lasse da durch klicken auf ein Bottum eine neue Dialogklasse anzeigen aber die wo der gedrückt wurden ist will sich net schließen...

Was meisnt du mit Testprogramm?
 
vielleicht dispose() statt setVisible(true),

ein Testprogramm ist ein Programm zum testen, welches du hier komplett posten kannst, damit es jeder testen kann,
nützliche Eigenschaften zum posten: kurz, komplett, keine unbekannten Klassen,
und sollte natürlich den aktuell fraglichen Fehler enthalten
 
ok hier mal ganz vereinfacht:
Erste Dlgk(Dialogklasse):
Java:
public class Start extends javax.swing.JFrame {

    /** Creates new form Start */
    public Start() {
        initComponents();

    }
private Login Login;

private void jMenuStartActionPerformed(java.awt.event.ActionEvent evt) {                                           
        Login=new Login();
        Login.setVisible(true);
        this.setVisible(false);
    }
nächste dlgk
Java:
public class Login extends javax.swing.JFrame {

    /** Creates new form Login */
    public Login() {
        initComponents();
    }
    
private Übersicht Übersicht;

private void btLoginActionPerformed(java.awt.event.ActionEvent evt) {                                        
            System.out.println("Login erfolgreich");
            Übersicht= new Übersicht(A1);
            Übersicht.setVisible(true);
    }
nächste dlgk:
Java:
private GebaeudeDlg GebaeudeDlg;
private void btGebaeudeActionPerformed(java.awt.event.ActionEvent evt) {                                           
        GebaeudeDlg=new GebaeudeDlg(DBAHQ, DBAM1, DBAS1, DBAOe1, DBAMue1);
        GebaeudeDlg.setVisible(true);
        System.out.println("Funzt?");
          
    }
Hier gibt er zwar Funzt? aus aber macht die klasse nicht Sichtbar
 
Zuletzt bearbeitet:
in der Klasse Start hast du eine weitere Variable Start? (Variablen immer klein schreiben)
dieses zweite Start wird gewiss überhaupt nicht angezeigt,
wie wärs mit

this.setVisible(false);
statt
Start.setVisible(false);
 
Danke SlaterB wenn du mir jetzt noch sagst wieso dieser Fehler hier kommt wenn ich die Methode bei der letzten Klasse ausführe könnte ich endlich mal das Projekt abschließen ^.^

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gamex.GebaeudeDlg.<init>(GebaeudeDlg.java:24)
at gamex.Übersicht.btGebaeudeActionPerformed(Übersicht.java:329)
at gamex.Übersicht.access$000(Übersicht.java:19)
at gamex.Übersicht$1.actionPerformed(Übersicht.java:111)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


das dispose geht leider nicht netbeans erkennt den befehl nicht und glaubt das ist eine Methode die noch nicht programmiert ist
 
ohne den GebaeudeDlg-Konstruktor zu kennen soll ich dir sagen was da schiefgeht?
na viel helft würde der auch nicht, irgendein Objekt in Zeile 24 ist null, bestimmt einer der Parameter,
alle anschauen, prüfen wo sie herkommen, gesetzt werden sollten usw.
 
Also ich hab mal geguckt aber alle parameter von den Objekten die weitergegeben werden haben get und set methoden und werden durch abrufen der Datenbank mit zahlen gefühlt^^
hier der kleine Konstruktor....:
Java:
public GebaeudeDlg(DBAnbindungHauptquartier DBAHQ, DBAnbindungMetallmine DBAM1, DBAnbindungSaegewerk DBAS1, DBAnbindungOelraffinerie DBAOe1, DBAnbindungMuehle DBAMue1) {
        initComponents();
        Integer StufeHQ, StufeM, StufeS, StufeO, StufeMu;
        StufeHQ=DBAHQ.getStufe()+1;
        StufeM=DBAM1.getStufe()+1;
        StufeS=DBAS1.getStufe()+1;
        StufeO=DBAOe1.getStufe()+1;
        StufeMu=DBAMue1.getStufe()+1;
        DBAHQ.ZeigeKostenHauptquartier(StufeHQ);
        DBAM1.ZeigeKostenMetallmine(StufeM);
        DBAS1.ZeigeKostenSaegewerk(StufeS);
        DBAOe1.ZeigeKostenOelraffinerie(StufeO);
        DBAMue1.ZeigeKostenMuehle(StufeMu);

        txtStufeHauptquartier.setText(Integer.toString(StufeHQ));
        txtHolzkostenHauptquarter.setText(Integer.toString(DBAHQ.getKostenHolz()));
        txtMetallkostenHauptquartier.setText(Integer.toString(DBAHQ.getKostenMetall()));
        txtOelkostenHauptquartier.setText(Integer.toString(DBAHQ.getKostenOel()));
        txtArbeiterkostenHauptquartier.setText(Integer.toString(DBAHQ.getKostenArbeiter()));

        txtStufeSaegewerk.setText(Integer.toString(StufeS));
        txtHolzkostenSaegewerk.setText(Integer.toString(DBAS1.getKostenHolz()));
        txtMetallkostenSaegewerk.setText(Integer.toString(DBAS1.getKostenMetall()));
        txtOelKostenSaegewerk.setText(Integer.toString(DBAS1.getKostenOel()));
        txtArbeiterkostenSaegewerk.setText(Integer.toString(DBAS1.getKostenArbeiter()));

        txtSufeOelraffinerie.setText(Integer.toString(StufeO));
        txtHolzkostenOelraffinerie.setText(Integer.toString(DBAOe1.getKostenHolz()));
        txtMetallkostenOelraffinerie.setText(Integer.toString(DBAOe1.getKostenMetall()));
        txtOelkostenOelraffinerie.setText(Integer.toString(DBAOe1.getKostenOel()));
        txtArbeiterkostenOelraffinerie.setText(Integer.toString(DBAOe1.getKostenArbeiter()));

        txtStufeMetallmine.setText(Integer.toString(StufeM));
        txtHolzkostenMetallmine.setText(Integer.toString(DBAM1.getKostenHolz()));
        txtMetallkostenMetallmine.setText(Integer.toString(DBAM1.getKostenMetall()));
        txtOelkostenMetallmine.setText(Integer.toString(DBAM1.getKostenOel()));
        txtArbeiterkostenMetallmine.setText(Integer.toString(DBAM1.getKostenArbeiter()));

        txtStufeMuehle.setText(Integer.toString(StufeMu));
        txtHolzkostenMuehle.setText(Integer.toString(DBAMue1.getKostenHolz()));
        txtMetallkostenMuehle.setText(Integer.toString(DBAMue1.getKostenMetall()));
        txtOelkostenMuehle.setText(Integer.toString(DBAMue1.getKostenOel()));
        txtArbeiterkostenMuehle.setText(Integer.toString(DBAMue1.getKostenArbeiter()));
    }
 
und was bringt das ohne die Zeile 24 zu kennen?

und dort ist ein Objekt null wie ich schon schrieb, was soll ich da mehr zu sagen?

Zeile 24, dort wird z.B.
x.setY(z.getA());
stehen, also ist x null oder z null,
also davor schreiben
System.out.println("x: "+x);
System.out.println("z: "+z);

-> dann erkennst du was null ist, dann reparierst du es,
da gibst doch gar nichts zu denken, das ist einfach nur abarbeiten
(man merkt dass ich das zum 100. Mal beantworte 😉 )

-----

extremst wichtig: Variablen klein schreiben
 
Zuletzt bearbeitet von einem Moderator:
gut ich weiß jetzt was null ist und zwar jegliche Objekte die ich hier übergeben habe:
Java:
public GebaeudeDlg(DBAnbindungHauptquartier DBAHQ, DBAnbindungMetallmine DBAM1, DBAnbindungSaegewerk DBAS1, DBAnbindungOelraffinerie DBAOe1, DBAnbindungMuehle DBAMue1)

aber ich verstehe nicht warum bevor ich die klasse GebaeudeDlg visible setze erzeuge ich die ganzen Objekte hier:
Java:
public Übersicht(Account A1) {
        initComponents();
        txtName.setText(A1.getName());
    Hauptquartier HQ=new Hauptquartier();
    DBAnbindungHauptquartier DBAHQ=new DBAnbindungHauptquartier(HQ);
    Metallmine M1=new Metallmine();
    DBAnbindungMetallmine DBAM1=new DBAnbindungMetallmine(M1);
    Saegewerk S1=new Saegewerk();
    DBAnbindungSaegewerk DBAS1=new DBAnbindungSaegewerk(S1);
    Oelraffinerie Oe1=new Oelraffinerie();
    DBAnbindungOelraffinerie DBAOe1=new DBAnbindungOelraffinerie(Oe1);
    Muehle Mue1=new Muehle();
    DBAnbindungMuehle DBAMue1=new DBAnbindungMuehle(Mue1);
In dieser Klasse Übersich tkann ich auch mit ihnen arbeiten und kann auch ihre Werte anzeigen lassen. und dann übergebe ich diese Objekte ja hier an die Klasse Gebaeudedlg:
Java:
private void btGebaeudeActionPerformed(java.awt.event.ActionEvent evt) {                                           
        GebaeudeDlg=new GebaeudeDlg(DBAHQ, DBAM1, DBAS1, DBAOe1, DBAMue1);
        GebaeudeDlg.setVisible(true);}
trotzdem sind diese gesamten Objekte obwohl ich sie an die Klasse übergeben habe null...Meine Lehrerin hat sich das auch angeguckt und hatte den verdacht durch vererbung da aber nirgends extends in den klassen steht sehen die sich nicht sondern sollen ja nur objekte hin udn herreichen...Gesetzt sind die ganzen Objekte also in der Klasse Übersicht sind sie nicht null erst nachdem ich sie übergebe werden sie null... 🙁
 
du erzeugst im Konstruktor lokale Variablen, die genau wie die Klassenattribute heißen, selbige bleiben aber null

schreibe
DBAHQ=new DBAnbindungHauptquartier(HQ);
statt
DBAnbindungHauptquartier DBAHQ=new DBAnbindungHauptquartier(HQ);
usw.
 
Danke so geht es.
Aber wieso ist dem so? Wärend dem Konstruktor sind sie ja nicht null...Ich würde nicht nur gerne wissen wie mein Programm geht sondern auch gerne wieso es nur so geht...sorry bin halt noch in der Lernphase 🙁
 
du erzeugst im Konstruktor lokale Variablen, die genau wie die Klassenattribute heißen
hast du den Satz auch gelesen und verarbeitet? da steht doch alles drin,

wenn du im Konstruktor mit
this.DBAHQ
auf das Klassenattribut zugreifst, ist es dort genauso null,
DBAHQ ist im Konstruktor nicht das Klassenattribut, sondern die lokale Variable, sofern eine vorliegt,
leider kann man in Java Attribute überdecken
 

Zurück
Oben