Java NullPointerExepcion bei setzen von Farbe

Tron36

Ensign
Registriert
Jan. 2011
Beiträge
209
Hallo Leute,

hab folgenden Code geschrieben:

Java:
package Aufgaben;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JRadioButton;

public class Valar extends JFrame {
    
    private JPanel contentPane;
    private  JPanel checkpanel;
    private  JPanel panelDraw;
    private  JButton btnStart;
    private  JRadioButton rdbtnJa;
    private  JRadioButton rdbtnNein;
    private  ButtonGroup btnGrp;
    private  JLabel pointstr;
    private  drawPoint point;
    
    private  String status;
    private  String answer;
    private  int diff;
    private  int sec;
    private  int count;
    

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
//        EventQueue.invokeLater(new Runnable() {
//            public void run() {
//                try {
//                    Valar frame = new Valar();
//                    frame.setVisible(true);
//                    btnStart.addActionListener(new ActionListener() {
//                        public void actionPerformed(ActionEvent e) {
//                            createLightPoint();
//                        }
//                    });
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        });
        new Valar().run();
    }

    /**
     * Create the frame.
     */
    public Valar() {
        setTitle("Aufgabe 1");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
//        this.setVisible(true);
        contentPane = new JPanel(new BorderLayout());
        setContentPane(contentPane);
        
        btnStart = new JButton("Start");
        btnStart.setBounds(0, 0, 434, 23);
        btnStart.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("Event listner StartButton");
                createLightPoint();
            }
        });
        contentPane.add(btnStart);
        
            checkpanel = new JPanel();
            checkpanel.setBounds(0, 229, 434, 33);
            contentPane.add(checkpanel);
            
            rdbtnJa = new JRadioButton("Ja");
            rdbtnJa.setSelected(false);
            checkpanel.add(rdbtnJa);
            
            rdbtnNein = new JRadioButton("Nein");
            rdbtnNein.setSelected(false);
            checkpanel.add(rdbtnNein);

            btnGrp = new ButtonGroup();
            btnGrp.add(rdbtnJa);
            btnGrp.add(rdbtnNein);
        
        panelDraw = new JPanel(new BorderLayout());
        panelDraw.setForeground(Color.BLACK);
        panelDraw.setBackground(Color.BLACK);
        panelDraw.setBounds(0, 22, 434, 206);
        contentPane.add(panelDraw);
        
//        point = new point();
//        point.setVisible(false);
//        point.setAlignmentX(alignmentX);
//        point.setHorizontalAlignment(JLabel.CENTER);
//        point.setVerticalAlignment(JLabel.CENTER);
//        panelDraw.add(point, BorderLayout.CENTER);
        
        pointstr = new JLabel("X");
        pointstr.setVisible(true);
        pointstr.setForeground(Color.WHITE);
        pointstr.setHorizontalAlignment(JLabel.CENTER);
        pointstr.setVerticalAlignment(JLabel.CENTER);
        panelDraw.add(pointstr, BorderLayout.CENTER);
                
        status = new String();
    }
    
    public void run() {
//        Valar frame = new Valar();
        setVisible(true);

        point = new drawPoint();
        System.out.println(point);
        point.setBackground(new Color(sec, sec, sec));
        point.setPreferredSize(new Dimension(434, 206));
        panelDraw.add(point, BorderLayout.CENTER);
        point.setVisible(false);
        
        //Variablen
        diff = 0;    //differenz zum ändern der Farbe
        sec = 0;    //zum setzen der Farbe des Punktes
        count = 0;    //zum zählen der Durchläufe
    }

//-----------------------------------------------------------------------------
    private void createLightPoint() {
//-----------------------------------------------------------------------------
        System.out.println("createLightPoint()");
        btnGrp.clearSelection();
        
        sec = sec + diff;

        System.out.println("Farbe " + sec);
        System.out.println("Point " + point);
        checkpanel.setVisible(false);
        pointstr.setVisible(false);
        point.setForeground(new Color(sec, sec, sec));
        point.setVisible(true);
        
        try {
            Thread.sleep(2000);
        }catch(InterruptedException e) {
            e.printStackTrace();
        }
        
        point.setVisible(false);
        pointstr.setVisible(true);
        checkpanel.setVisible(true);
        choice();
    }
//-----------------------------------------------------------------------------
    public  void choice() {
//-----------------------------------------------------------------------------
        do {
            rdbtnJa.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Radiobutton Ja");
                    
                    if(status.equals("ueberschwellig")) {
                        diff = -20;
                    } else {
                        sec = 255;
                        diff = 0;
                        status = "ueberschwellig";
                    }
                    answer = "JA";
                }
            });
            //Nochmalls anschauen:
            rdbtnNein.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    System.out.println("Radiobutton Nein");
                    
                    if(status.equals("ueberschwellig")) {
                        sec = 0;
                        diff = 0;
                        status = "unterschwellig";
                    } else {
                        diff = 20;
                    }
                    answer = "NEIN";
                }
            });
            count++;
        }while(btnGrp.getSelection() == null /*&& count <= 6*/);
        
        System.out.println("Light Point " + status + " " + sec + " " + answer + " " + diff);
        
        //in .txt Datei schreiben!
        //createLightPoint();
    }
}
class drawPoint extends JPanel{
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D pointer = (Graphics2D) g;

        pointer.setColor(Color.WHITE);
        pointer.drawOval(0, 0, 1, 1);
//        setSize(1, 1);
      }
}

Der Code lässt sich zwar Probelmlos starten, wenn mann aber nach dem Start den "Startbutton" Drückt kommt folgende Fehlermeldung:
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at Aufgaben.Valar.createLightPoint(Valar.java:142)
    at Aufgaben.Valar$1.actionPerformed(Valar.java:75)
    at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
    at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
    at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
    at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
    at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:279)
    at java.desktop/java.awt.Component.processMouseEvent(Component.java:6632)
    at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
    at java.desktop/java.awt.Component.processEvent(Component.java:6397)
    at java.desktop/java.awt.Container.processEvent(Container.java:2263)
    at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5008)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
    at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
    at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
    at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
    at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2772)
    at java.desktop/java.awt.Component.dispatchEvent(Component.java:4840)
    at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:772)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
    at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:715)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:745)
    at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:743)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
    at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
    at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
    at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
    at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Die variable
Code:
sec
zum setzen der RGB Werten ist vorhanden und müsste eigl. schon vor dem aufruf zum setzen der Farbe, initialisiert werden.

Ich kann mir irgendwie nicht erklären warum die Fehlermeldung aufgeworfen wird.

Ich hoffe ihr könnt mir Helfen.

Lg
tron36
 
Zuletzt bearbeitet:
Ich vermute mal ganz stark, dass das Objekt "point" in Zeile 142 auf null referenziert.

greetz
hroessler
 
Das Objekt point wird eigentlich in der run Methode aufgerufen. Die Run Methode wird wiederum als erstes (also bevor die Methode createLightPoint() aufgerufen) in der main-Methode aufgerufen, wo das point-Objekt referenziert wird.

Eigl. musste es doch kein problem entstehen, oder?
 
Hi,

Zeilenweise Debuggen, schauen wo genau der Fehler auftritt, Variablen und Objekte an den Stellen vorher prüfen und/oder ausgeben lassen, fixen.

VG,
Mad
 
  • Gefällt mir
Reaktionen: mental.dIseASe und hroessler
Tron36 schrieb:
Das Objekt point wird eigentlich in der run Methode aufgerufen. Die Run Methode wird wiederum als erstes (also bevor die Methode createLightPoint() aufgerufen) in der main-Methode aufgerufen, wo das point-Objekt referenziert wird.

Eigl. musste es doch kein problem entstehen, oder?
Hier tritt die Exception auf:
"at Aufgaben.Valar.createLightPoint(Valar.java:142)"

Und es kann nur das "point" Objekt sein. Am Besten wie @Madman1209 es vorgeschlagen hat, mal den Debugger nehmen.

greetz
hroessler
 
ähm
Java:
public void run() {
        Valar frame = new Valar();
frag dich mal ob das richtig ist in der run() Methode nochmal den Konstruktor aufzurufen ...
 
  • Gefällt mir
Reaktionen: dominic.e
Wie abcddcba schon sagt,
das Problem ist, dass du in der run() Methode Valar noch einmal erstellst. Das point-Object in der neu erstellten Klasse ist aber noch null, weil das point = new point(); sich auf this bezieht, nicht auf das neue Valar-Object

Entferne das point = new point(); und mach
this.setVisible(true); bzw. einfach nur setVisible(true); weil du dich ja bereits im Scope des Frames befindest.
 
hroessler schrieb:
Hier tritt die Exception auf:
"at Aufgaben.Valar.createLightPoint(Valar.java:142)"

Und es kann nur das "point" Objekt sein. Am Besten wie @Madman1209 es vorgeschlagen hat, mal den Debugger nehmen.

greetz
hroessler
Soweit war ich auch. Mir ist schon klar, in welcher Zeile das Problem auftaucht.
Die frage ist jedoch warum? Point müsste ja definitiv in der run() Methode referenziert worden sein.[/ICODE]
 
Zuletzt bearbeitet:
Hi,

bin zwar eher aus der Web- und .NET-Ecke, aber man kann doch sicherlich in Java auch Breakpoints zum Debuggen setzen, oder?

VG,
Mad
 
Schlau. Wenn ich weitergekommen wäre, hätte ich es hier im Forum nicht gefragt! Das mal zu Brakpoints.

dominic.e schrieb:
Wie abcddcba schon sagt,
das Problem ist, dass du in der run() Methode Valar noch einmal erstellst. Das point-Object in der neu erstellten Klasse ist aber noch null, weil das point = new point(); sich auf this bezieht, nicht auf das neue Valar-Object

Entferne das point = new point(); und mach
this.setVisible(true); bzw. einfach nur setVisible(true); weil du dich ja bereits im Scope des Frames befindest.


meinst du statt point = new point(); auzukommentieren, denValar frame = new Valar(); auskommentieren?
Hab ich gemacht. Das problem ist, dass das Programm sich dann "aufhängt" bzw. abstürtz, nach dem ich das Start-Button gedrückt habe, ohne eine fehlermeldung auszugeben.
 
Zuletzt bearbeitet:
Ich habe keine Ahnung, was das für ein Framework ist, aber du schaltest dein in run() abermals erstelltes Valar visible. Für das wird aber nie run aufgerufen, also auch kein Point instanziiert.

Schau dir bitte nochmal an, was dein Programm da tut (zeichne es dir ggf. auf) und debugge oder printe dich durch das Programm. Sinnvoll ist sicherlich auch, wenn du an einigen Stellen System.out.println(this) machst, um zu sehen, dass du mit zwei verschiedenen Objekten hantierst, weil du ja auch zwei erstellst.
 
Wie andere schon richtig geschrieben haben:
Das Problem ist hier, dass du eine zweite Instanz von Valar in Zeile 119 instanziierst und diese eine Zeile darunter auch sichtbar machst.

Dein Hauptfenster / erstes Valar-Objekt allerdings bleibt unsichtbar, da du dieses nicht sichtbar machst. Nur das in Zeile 57 erstellte Objekt, auf welchem du run() aufrufst, hat das Attribut point initialisiert.
 
Ich hab da jetzt noch ein extra Mal drübergeschaut und irgendwie seh ich bei dem "OO" nicht durch. Steinigt mich, aber das sieht mir eher wie Batch in JAVA-Syntax aus. Sorry.

Überarbeite das mal. Programmlogik gehört nicht in den Konstruktor und OO kennt zwar Klassenvariablen, aber das macht diese nicht zu globalen Variablen; sowas kennt OO überhaupt nicht. Im Zweifel übergibt man der Methode das oder die erforderlichen Objekte.

Soweit ich das überblicke, ohne selber einen Entkäferer drüberlaufenzulassen, würde ich erwarten, daß da mehr als nur eine Variable zur Laufzeit undefiniert bleibt.
 
Wie man eigentlich schon am Verlauf der Diskussion hier erkennen kann ist die komplette Struktur des Codes verhunzt. Das macht das Lesen um einiges schwieriger und solche Fehler schleichen deutlich einfacher/schneller ein.
Zumal solltest du dein komplettes Frame in eine andere Klasse auslagern, das macht das Ganze um einiges übersichtlicher.
 
  • Gefällt mir
Reaktionen: mental.dIseASe
Zurück
Oben