Compiler-Fehler Klasse A nutzt Objekt von Klasse B, um Methode von Klasse B auszuführen

raptus93

Mitglied
Hallo zusammen,

ich komme wieder einmal mit einem scheinbaren Anfängerproblem, suche aber schon seit Stunden nach dem Fehler. Ich will in Klasse A ein Objekt von Klasse B erzuegen, um eine Methode von Klasse B auszuführen. Diese Methode wiederrum greift auf Objekte von Klasse B zu. Das scheitert bei mir an einer NullPointerException. Ein Freund riet mir, eine try-catch Struktur miteinzubeziehen, was für ihn ein ähnliches Problem löste, also hab ich es probiert. Die NullPointer kommt immer noch.
Hier der Code der Methode aus Klasse A(QButton), welcher eine Methode der Klasse B(QFrame) aufrufen soll:

Java:
public void verloren()
    {
            verloren=true;    //unwichtig
            QFrame testframe = new QFrame();
            try
            {
                testframe.timerStoppen();
            }
            catch(IOException e)
            {
                            
            }
            
            System.out.println("Verloren!");   //unwichtig
    }

Und nun ein Blick in die andere Klasse (QFrame):

Java:
//Im Datenfeld werden 9 Objekte von Klasse A(QButton) erzeugt.

protected void timerStoppen() throws IOException      //Die Timer aller Instanzen von Button werden gestoppt
    {
        button1.timer.stop();
        button2.timer.stop();
        button3.timer.stop();
        button4.timer.stop();
        button5.timer.stop();
        button6.timer.stop();
        button7.timer.stop();
        button8.timer.stop();
        button9.timer.stop();
    }

Wie löse ich dieses Problem?
Muss ich dafür den gesamten Code posten (lang und unübersichtlich).. oder reicht dieser (scheinbar) betroffene Code?

Ich danke für alle Antworten und freundliche Grüße!
 
Bist du bereit die genaue Codezeile zu nennen, in der NullPointerException auftritt?
Vermutlich ist einer dieser Objekte "button1"."timer".stop();
nicht initialisiert worden? Den Teil des Codes können wir ja nicht sehen.

Wenn z.B. QFrame testframe nicht initialisiert worden währe, hättest du beim Aufruf vom timerStoppen() eine NullPointerException erhalten. Das kannst du ja mal machen, um dir das ein bisschen klarer zu machen.

Java:
QFrame testframe;// = new QFrame();
testframe.timerStoppen();

Das selbe Problem hast du offensichtlich bei deinen buttonX.timer.stop() Aufruf.

try&catch an der Stelle zu verwenden macht kaum Sinn, weil die Konsequenz aus dem Fehler ja ist, das du aus der Codezeile rausfliegst und in dem catch Bereich der Thread weiterläuft (vereinfacht gesagt ^.^ )
Somit würde dein Programm dort weiterlaufen, was du aber möchtest ist das deine buttonX.timer.stop(); Methoden ihre zugewiesene Logik ausführen.
 
Zuletzt bearbeitet:
Also was mir noch fehlt ist:

Wo tritt die Nullpointerexeption auf? Zeile? In klasse A oder KlasseB?
Der Errorlog wär super.

Desweiteren ist dein Try-Catch für die Katz, denn in deinem Catch passiert ja nichts?
Baue mal in deinem Catch das ein:
Java:
Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, ex);

So, ohne dem Errorlog kann man nicht viel dazu sagen
 
Der ErrorLog(hoffe du meinst dieses hier xP)

"Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at QFrame.timerStoppen(QFrame.java:65)
at QButton.verloren(QButton.java:70)
at QButton.abdunkelnFarbmechanik(QButton.java:61)
at QButton.access$000(QButton.java:5)
at QButton$1.actionPerformed(QButton.java:46)"

Das hier steht im Datenfeld des QFrame:

Java:
private QButton button1 = new QButton(quadratBreite(),0,0);
    private QButton button2 = new QButton(quadratBreite(),quadratBreite()+lueckenBreite(),0);
    private QButton button3 = new QButton(quadratBreite(),2*quadratBreite()+2*lueckenBreite(),0); 
    private QButton button4 = new QButton(quadratBreite(),0,quadratBreite()+lueckenBreite());
    private QButton button5 = new QButton(quadratBreite(),quadratBreite()+lueckenBreite(),quadratBreite()+lueckenBreite());
    private QButton button6 = new QButton(quadratBreite(),2*quadratBreite()+2*lueckenBreite(),quadratBreite()+lueckenBreite()); 
    private QButton button7 = new QButton(quadratBreite(),0,2*quadratBreite()+2*lueckenBreite());
    private QButton button8 = new QButton(quadratBreite(),quadratBreite()+lueckenBreite(),2*quadratBreite()+2*lueckenBreite());
    private QButton button9 = new QButton(quadratBreite(),2*quadratBreite()+2*lueckenBreite(),2*quadratBreite()+2*lueckenBreite());

daran sollte es aber nicht liegen... denke ich.

Die Exception findet laut BlueJ Debugger bei der Zeile
[Java]testframe.timerStoppen();[/code]
statt.

Was bedeutet das, was ich in den Catch schreiben soll? Was muss ich dafür importieren?
 
Zuletzt bearbeitet:
...upps, hab jetzt verstanden welchen ErrorLog du wolltest. Sekunde.

Wenn ich es einbaue, kommt:

"cannot find symbol, variable ex"

vom Compiler.

Trotz import von java.util.logging
 
Zuletzt bearbeitet:
Der Fehler passiert in Zeile 65 deiner Klasse QButton.
Bitte poste doch am besten deine komplette Klasse und markiere, welche Zeile bei dir Zeile 65 ist.
 
Die Objekte müsste es alle geben (zumindest nach meinem Verständnis, vllt sieht Mr. Compiler das anders). Wie kann ich das ändern? Was muss ich tun, um mein Problem zu lösen.
 
Java:
import java.awt.Color;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.logging.*;
public class QButton extends JButton
{   
    public Timer timer;
    static boolean verloren=false;
    public QButton(int width, int xPos, int yPos)
    {
        setBounds(xPos+390,yPos+170,width-6,width-6);
        setBackground(Color.white);
    }
    public void aufhellen(int hellwert, QButton button)
    {
        if(getRotwert(button)+hellwert<=255||getGruenwert(button)+hellwert<=255||getBlauwert(button)+hellwert<=255)
        {   
            setBackground(new Color (getRotwert(button)+hellwert,getGruenwert(button)
                +hellwert,getBlauwert(button)+hellwert));
        }
    }
    private int getRotwert(QButton button)
    {
        Color farbe = button.getBackground();
        int rotwert = farbe.getRed();
        return rotwert;
    }
    private int getGruenwert(QButton button)
    {
        Color farbe = button.getBackground();
        int gruenwert = farbe.getGreen();
        return gruenwert;
    }
    private int getBlauwert(QButton button)
    {
        Color farbe = button.getBackground();
        int blauwert = farbe.getBlue();
        return blauwert;
    }
    public void abdunkelnAnstossen(final int dimmwert, final QButton button)
    {
        timer = new Timer(200, new ActionListener() 
        {
            public void actionPerformed(ActionEvent e)
            {
                abdunkelnFarbmechanik(dimmwert, button);
            }
        }
        ); 
        timer.start();      
    }
    private void abdunkelnFarbmechanik(int dimmwert, QButton button)
    {
        if(getRotwert(button)-dimmwert>=0||getGruenwert(button)-dimmwert>=0||getBlauwert(button)-dimmwert>=0)
        {   
             setBackground(new Color (getRotwert(button)-dimmwert,getGruenwert(button)-dimmwert
                 ,getBlauwert(button)-dimmwert));
        }
        else
        {
             verloren();
        }
    }
    public void verloren()
    {
            verloren=true;
            //timer.stop();
            QFrame testframe = new QFrame();
            try{
                testframe.timerStoppen();
            }
            catch(IOException e){
                //Logger.getLogger(serverThread.class.getName()).log(Level.SEVERE, null, e);            
            }
            
            System.out.println("Verloren!");
    }
    /*public void stoppe(Timer timer)
    {
        timer.stop();
    }*/
}

65 genau wie hier ...
 
Zuletzt bearbeitet:
führe doch bitte nochmal aus und schau nach, der Fehler dürfte jetzt in einer anderen Zeile sein.
Wahrscheinlich hattest du den Code nochmal angepasst.
 
Weil ich gerade meinen Code sehe, aber leider falsch:

Java:
Logger.getLogger(QButton.class.getName()).log(Level.SEVERE, null, e);

Stimme PrincE zu. Poste nochmal den Errorlog bitte.
 
> "Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at QFrame.timerStoppen(QFrame.java:65)

der Fehler findet in Zeile 65 von QFrame statt, nicht in Zeile 65 von QButton

und zwar wahrscheinlich bei
> button1.timer.stop();

button1 selber ist definiert als direkt erzeugtes Instanzattribut,
allerdings ist der timer nicht gestartet, nicht gesetzt

-----

das ganze Problem ist ursprünglich, dass in QButton verloren() ein neues QFrame-Objekt erzeugt wird,
das darf nicht geschehen,

hier muss das eine vorhandene, in der GUI sichtbare JFrame/ QFrame aufgerufen werden,
das welches schon die ganze Zeit seine Buttons hat, dort auch Timer gestartet hat,

QFrame könnte jedem Button sich selber als Parameter im Konstruktor übergeben:
> private QButton button1 = new QButton(this, quadratBreite(),0,0);

die Button merken sich das QFrame als Attribut, dann kann man später an diesem genau richtigen (statt neuen zweiten) QFrame-Objekt etwas aufrufen
 

Zurück
Oben