Zusammenspiel von Klassen

Ignus

Mitglied
Hallo,

ich verstehe nicht ganz warum ich bei meinem zeug hier eine "Exception in thread "Timer-0" java.lang.NullPointerException
" erzeuge. Ich hoffe irgend jemand kanns mir mal erklären ;)
Unten ist mein Code. So ich will jetzt einfach aus einer anderen Klasse heraus eine Objekteigenschaft von "labe1A" in der Classe "Test" verändern über "btn1 " welcher einen void in der besagten anderen Klasse anstößt.

Code:
public class Test extends JFrame {
    private JFrame fnst1 = new JFrame("Testfenster");   //Fenster
    public JLabel labe1A = new JLabel();           //Label
    private SimpleDateFormat df;                    //Datum/Uhrzeit
    private Timer timer = new Timer();              //Timer
    private Tasks Zeittask = new Tasks();
    private JButton btn1 = new JButton("Hallo1");   //Button

    Test() {
        tableinhalt();
        
        //Erstellt ein Fenster
        fnst1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fnst1.setSize(640,480);
        fnst1.setResizable(false);
        fnst1.setLayout(null);
        
        //Erstellt Buttons###############################
        btn1.setBounds(10, 100, 100, 20);  //Positionszuweisung + Abmaße
        fnst1.add(btn1);                    //Hinzufügen zum Container(fnst1)

        //Erstellt ein Label mit Datum####################
        df = new SimpleDateFormat( "dd.MM.yyyy hh:mm:ss" );
        labe1A.setText(df.format(new Date()));
        labe1A.setBounds(500,10,130,17);        
        fnst1.add(labe1A); 
        System.out.println( df.format(new Date()) );

        //###############################
        //Actionlistener 
        btn1.addActionListener( new ActionListener(){public void actionPerformed(       ActionEvent e ){
           act1(e);
        }});
         btn1.addActionListener( a1 ) ;
         

        fnst1.setVisible(true); //fertiges Applet/Fenster anzeigen
}        

    public void act1(ActionEvent e){
    //Zeitgesteuerter Taskaufruf aus der Tasks-Klasse
    Zeittask.Tasknr = 1;
    timer.schedule ( Zeittask, 1000, 1000 );

    }
} //end Class Test

public class Tasks extends TimerTask {

    public int Tasknr;
    private String Uhrzeit;
    private SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
    Test tt;

    public Tasks() {
    }

    public void Taskselect() {
    
        switch ( Tasknr ) 
        { 
          case 0: 
          case 1: Timerun(); 
        }
    }

    public void Timerun() {
    
        Uhrzeit = (df.format(new Date()));
        System.out.println("Zeit: " + Uhrzeit);
        tt.labe1A.setText(Uhrzeit);
      
    }

    public void run() {
        Taskselect();
    }

}
 
Hallo,

Dein Problem ist, dass du von Test kein Objekt instanzierst, sondern nur

Code:
Test tt;
schreibst. tt ist somit null und du bekommst eine NullPointerException.

Du solltest vielleicht
Code:
Test tt = new Test();
schreiben.

MFG
zEriX
 
Schön wärs ja, aber das funktioniert leider nicht. Dann verfängt sich alles in einer art Initialisierungsschleife, da ich schon in der Klasse Test ein " private Tasks Zeittask = new Tasks();" instanziere/erzeuge.
Irgendwie verstehe ich das Ding nicht. Vom logischen Standpunkt her, spricht doch eigendlich nix dagegen oder? Normal muss es doch möglich sein in einer aktiven Klasse (das laufende Programm) mit einer anderen Klasse dort Veränderungen vorzunehmen.
 
Zuletzt bearbeitet:
Also deine NullPointerException liegt daran, tt in Tasks null ist.
Das Problem was du lösen willst, solltest du so lösen
Code:
public class Tasks extends TimerTask {

    public int Tasknr;
    private String Uhrzeit;
    private SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
    Test tt;

    public Tasks(Test tt) {
        this=tt;
    }

    public void Taskselect() {
    
        switch ( Tasknr ) 
        { 
          case 0: 
          case 1: Timerun(); 
        }
    }

    public void Timerun() {
    
        Uhrzeit = (df.format(new Date()));
        System.out.println("Zeit: " + Uhrzeit);
        tt.labe1A.setText(Uhrzeit);
      
    }

    public void run() {
        Taskselect();
    }

}
.


Code:
public class Test extends JFrame {
    private JFrame fnst1 = new JFrame("Testfenster");   //Fenster
    public JLabel labe1A = new JLabel();           //Label
    private SimpleDateFormat df;                    //Datum/Uhrzeit
    private Timer timer = new Timer();              //Timer
    private Tasks Zeittask = new Tasks(this);


So müsste es funktionieren.
 
Vielen dank für die Lösung. Hat mir, denke ich, gut weiter gebracht.:)

mit
Code:
...
Test xx;

    public Tasks(Test tt) {
        this.xx = tt;
    }
...
xx.labe1A.setText(Uhrzeit);
...
gings dann.

Also verlangt das ganze erstmal eine Objektinitialisierung und dann eine Zuweisung/Gleichsetzung zum vorhandenen gleichen Objekt (mit "this.xx = tt;").

(Lustig, man kann hier im Forum nicht an das "this." ein "tt" anhängen. Warum auch immer :?)
 
Also deine Klasse Tasks kennt ja deine Objekt von Test gar nicht. Um das Objekt in der Klasse bekannt zu machen, musst du es übergeben.
Code:
public Tasks(Test tt)

Da du ja nicht nur im Konstruktor darauf zugreifen willst, brauchst du eine Variable die nicht nur im Konstruktor bekannt ist. Da kommt dann dein xx ins Spiel.
Code:
this.xx = tt;

So kannst du dann auf das Objekt von Test zugreifen. Nur mit Test xx hast du noch kein Objekt dass du ansprechen kannst. Du musst entweder ein neues erzeugen oder auf ein anderes verweisen.


MFG

zEriX
 
Zurück