Wieder mal ne NullPointer Exception.

Status
Nicht offen für weitere Antworten.

Revenant

Aktives Mitglied
Hi,

zum 2. mal jetzt hab ich dieses Problem. Kann den Fehler einfach nicht finden.. kompilieren geht, aber ausführen nicht. Der Fehler tritt in Zeile 117 auf in der paintComponent Methode des Panels, in das ich zeichnen möchte.

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at CJPanel.paintComponent(CGrafik.java:117)
.......


Code:
//dieses Programm zeigt unter Verwendung der Panel Komponente das Zeichnen von
//verschiedenen Figuren mit Hilfe von Optionsfeldern


import javax.swing.*;    //Swing-Komponenten
import java.awt.*;       //der Layout-Manager
import java.awt.event.*; //die Ereignisbehandlung


//die Hauptklasse
public class CGrafik {
    public static void main(String[] args){
	CFenster fenster = new CFenster("Zeichnen");
	fenster.pack();
	fenster.setSize(450,350);
	fenster.setResizable(true);
	fenster.setVisible(true);
    }
}


//Die Klasse des Fensters
class CFenster extends JFrame {
    ButtonGroup knopfgruppe;
    
    //der Konstruktor
    CFenster (String titel) {
	//ruft zunächst den Konstruktor der Basisklasse auf
	super(titel);
	//ein Layout-Manager für das Fenster wird angelegt
	setLayout(new FlowLayout());
	setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
	
	//ein neues Panel für die Zeichenfläche
	CJPanel panel = new CJPanel(knopfgruppe);
	add(panel);
    
	//ein Panel für die RadioButtons
	JPanel knopfpanel = new JPanel();
	add(knopfpanel);

	//Die Buttons werden erstellt
	JRadioButton knopf1 = new JRadioButton("Kreis",false);
	JRadioButton knopf2 = new JRadioButton("Scheibe",false);
	JRadioButton knopf3 = new JRadioButton("Rechteck",false);

	//Befehlsnamen für Ereignisbehandlung festelegen
	//der Einfachheit halber = dem Buttonnamen
	knopf1.setActionCommand("Kreis");
	knopf2.setActionCommand("Scheibe");
	knopf3.setActionCommand("Rechteck");

	//erstellen einer ButtonGroup um mit den RadioButtons umgehen zu können
	//liefert Methoden die die selektierten Buttons zurückgeben, bewirkt 
	//ausserdem, dass nur 1 Knopf der Gruppe selektiert werden kann
	knopfgruppe = new ButtonGroup();
	
	//dem Panel hinzugefügt
	knopfpanel.add(knopf1);
	knopfpanel.add(knopf2);
	knopfpanel.add(knopf3);

	//die Buttons der ButtonGruppe hinzufügen
	knopfgruppe.add(knopf1);
	knopfgruppe.add(knopf2);
	knopfgruppe.add(knopf3);
	
	knopfpanel.setLayout(new GridLayout(3,1,20,20));
	knopfpanel.setBorder(BorderFactory.createEtchedBorder(1));
	knopfpanel.setBorder(BorderFactory.createTitledBorder("Form"));
    }

}


class CJPanel extends JPanel{
    int mx, my; //Mauskoordinaten
    ButtonGroup knopfgruppe;

    CJPanel (ButtonGroup kgruppe) {
	knopfgruppe = kgruppe;
	//dem Panel wird ein Listener zur Ereignisbehandlung zugewiesen
	addMouseListener(new CMausListener());
    }
    
    public Dimension getMinimumSize() {
	return new Dimension(300,300);
    }
    
    public Dimension getPreferredSize() {
	return getMinimumSize();
    }
    
    //der MausListener zur Ereignisbehandlung des Panels
    //wird natürlich im Panel an sich definiert, da er ja auch zu diesem gehört
    class CMausListener extends MouseAdapter {
	public void mousePressed(MouseEvent e) {
	    //die aktuelle Position der Maus merken
	    mx = e.getX();
	    my = e.getY();
	}
    }
    
    //in dieser Methode wird gezeichnet!
    public void paintComponent(Graphics g) {
	//Aufruf des Super-Konstruktors bei paintComponent ein MUSS
	super.paintComponent(g);
	//Festlegen der Hintergrundfarbe
	setBackground(Color.black);

	String befehlsname; //String zum Überprüfen des ActionCommands
	ButtonModel aktuell = null; //ButtonModel des ausgewählten Knopfes
	
	//welcher Knopf ist ausgewählt? -> gibt das ButtonModel
	aktuell = knopfgruppe.getSelection(); // HIER TRITT DER FEHLER AUF

	//durch das ButtonModel lässt sich der Befehlsname des Knopfes erfragen
	//und somit seine Identität feststellen
	befehlsname = aktuell.getActionCommand();
	
	//entsprechend reagieren
	if (aktuell == null)
	    return;

	//grüne Farbe zum zeichnen
	g.setColor(Color.green);

	if(befehlsname.equals("Kreis"))
	    g.drawOval(mx,my,40,40);

	if(befehlsname.equals("Scheibe"))
	    g.fillOval(mx,my,40,40);

	if(befehlsname.equals("Rechteck"))
	    g.drawRect(mx,my,40,40);
    }
}

Hoffe es kann mir jemand helfen...
 

muckelzwerg

Bekanntes Mitglied
Ich kann keine Stelle finden, an der eine ButtonGroup erzeugt wird.
So wie ich das sehe reichst Du die ganze Zeit ein leeres "knoppfgruppe" durch die Gegend.

-- -- muckelzwerg
 

Murray

Top Contributor
Offenbar wird paintComponent aufgerufen, bevor Du knopfgruppe initialisiert hast. Das kann man aber leicht abfangen:

Code:
public void paintComponent(Graphics g) {

   super.paintComponent(g);

   //Festlegen der Hintergrundfarbe
   setBackground(Color.black);

   String befehlsname; //String zum Überprüfen des ActionCommands
   ButtonModel aktuell; //ButtonModel des ausgewählten Knopfes
   
   //welcher Knopf ist ausgewählt? -> gibt das ButtonModel
   if ( kopfgruppe != null) {
      aktuell = knopfgruppe.getSelection();
   }

   if ( aktuell == null) {
       return;
   }

   //durch das ButtonModel lässt sich der Befehlsname des Knopfes erfragen
   //und somit seine Identität feststellen
   befehlsname = aktuell.getActionCommand();
   
   //entsprechend reagieren
  
   //grüne Farbe zum zeichnen
   g.setColor(Color.green);

   if ( "Kreis".equals( befehlsname) ) {
       g.drawOval(mx,my,40,40);
   } else if ( "Scheibe".equals( befehlsname) ) {
       g.fillOval(mx,my,40,40);
   } else if ( "Rechteck".equals( befehlsname) ) {
       g.drawRect(mx,my,40,40);
   }
}
 
R

Roar

Gast
knopfgruppe ist in der klasse aber immer null, weil null im konstruktor übergeben wird.
 

Murray

Top Contributor
Roar hat gesagt.:
knopfgruppe ist in der klasse aber immer null, weil null im konstruktor übergeben wird.

Stimmt natürlich. Also die Zeile
Code:
knopfgruppe = new ButtonGroup();
weiter nach oben (vor den Aufruf des CJPanel-Konstruktors) schieben.
 

Revenant

Aktives Mitglied
muckelzwerg hat gesagt.:
Ich kann keine Stelle finden, an der eine ButtonGroup erzeugt wird.
So wie ich das sehe reichst Du die ganze Zeit ein leeres "knoppfgruppe" durch die Gegend.

In Zeile 57 wurde eine Instanz der Klasse ButtonGroup erzeugt.

murray hat gesagt.:
Roar hat folgendes geschrieben::
knopfgruppe ist in der klasse aber immer null, weil null im konstruktor übergeben wird.


Stimmt natürlich. Also die Zeile
Code:

1


knopfgruppe = new ButtonGroup();

weiter nach oben (vor den Aufruf des CJPanel-Konstruktors) schieben.

Jo das wars. Es is dann noch so ne NullPointerException aufgetreten, aber im Endeffekt lag auch die wieder daran, dass ich da mit was gearbeitet habe, "das noch nicht initialisiert war". Der Vollständigkeit halber:

die Zeile

Code:
befehlsname = aktuell.getActionCommand()
in der paintComponent Methode muss nach der If-Anweisung stehen, da ja am Anfang kein RadioButton selektiert ist und aktuelle = null ist.

Vielen Dank für eure Hilfe, bin jetzt wieder um ne Erfahrung reicher :wink:


Gruß
Revenant
 

Murray

Top Contributor
Revenant hat gesagt.:
die Zeile

Code:
befehlsname = aktuell.getActionCommand()
in der paintComponent Methode muss nach der If-Anweisung stehen, da ja am Anfang kein RadioButton selektiert ist und aktuelle = null ist.

Hatte ich in meinem Post bereits umgestellt :wink:

Außerdem habe ich die Fallunterscheidung noch umgestellt: erstens kann man die Vergleiche umdrehen ( Stringliteral.equals( Variable) anstelle von Variable.equals( Stringliteral) ist sicherer, weil keine NullpointerException auftreten kann); zweitens sollten man in solchen Fällen mit else if arbeiten, um unnötige Vergleiche zu vermeiden (wenn der erste Vergleich bereits stimmt, dann braucht man alle anderen nicht mehr zu prüfen).
 

Revenant

Aktives Mitglied
Murray hat gesagt.:
Revenant hat gesagt.:
die Zeile

Code:
befehlsname = aktuell.getActionCommand()
in der paintComponent Methode muss nach der If-Anweisung stehen, da ja am Anfang kein RadioButton selektiert ist und aktuelle = null ist.

Hatte ich in meinem Post bereits umgestellt :wink:

Außerdem habe ich die Fallunterscheidung noch umgestellt: erstens kann man die Vergleiche umdrehen ( Stringliteral.equals( Variable) anstelle von Variable.equals( Stringliteral) ist sicherer, weil keine NullpointerException auftreten kann); zweitens sollten man in solchen Fällen mit else if arbeiten, um unnötige Vergleiche zu vermeiden (wenn der erste Vergleich bereits stimmt, dann braucht man alle anderen nicht mehr zu prüfen).


du verdammter gosu :D ! da sieht man ja mal echt was du aufm kasten hast - genial!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
DrahtEck Schleife soll wieder da anfangen wo ich es möchte ! Java Basics - Anfänger-Themen 17
G JTree speichern und wieder einlesen Java Basics - Anfänger-Themen 5
W In alten Code zurück- und dort wieder zurechtfinden? Java Basics - Anfänger-Themen 17
I Passwort in Datenbank speichern um später wieder auszulesen Java Basics - Anfänger-Themen 5
Temsky34 Wie bekomme ich dieses Java-Warning wieder weg? Java Basics - Anfänger-Themen 2
T j.u.Scanner(Sys.in).nextLine() wieder schließen? Java Basics - Anfänger-Themen 5
f3mys Objektwerte in Liste speichern und wieder abrufen Java Basics - Anfänger-Themen 23
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
Naxon89 Input/Output Ein PDF in einem BLOB umwandeln um ihn dann als PDF wieder anzuzeigen Java Basics - Anfänger-Themen 3
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
MichelNeedhelp Brauche zu diesem Labyrinth ein Skript? Der Hamster soll im Urzeigersinn das ganze Labyrinth abgehen und wieder an seinem Ursprungsplatz sein. Java Basics - Anfänger-Themen 40
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
TimoN11 Array -> Schleife wieder von vorne durchlaufen lassen Java Basics - Anfänger-Themen 1
JD_1998 Arrays einlesen, zwischenspeichern und wieder ausgeben Java Basics - Anfänger-Themen 8
M Regex Probleme (mal wieder) Java Basics - Anfänger-Themen 3
J Selektiertes Element von jComboBox zwischenspeichern und wieder einsetzen Java Basics - Anfänger-Themen 0
S Nutzereingabe splitten und in string array wieder ausgeben. Java Basics - Anfänger-Themen 1
I wieder mit einer Umwandelung habe ich Problem (diesmal von char Array zu char) Java Basics - Anfänger-Themen 1
N Wie kann ich einen String wieder zusammensetzen und ausgeben lassen? Java Basics - Anfänger-Themen 9
C Array-Eintrag wieder auf Null setzen Java Basics - Anfänger-Themen 3
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
J Geld speichern und wieder auslesen Java Basics - Anfänger-Themen 10
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
CptK Datentypen Verdrehte Wörter wieder herstellen Java Basics - Anfänger-Themen 21
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
M Schleifenergebnis in selbiger wieder verwenden Java Basics - Anfänger-Themen 7
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
L jar, class, java und wieder zurück Java Basics - Anfänger-Themen 8
M aus Fenster anderes Fenster öffnen und wieder umgekehrt Java Basics - Anfänger-Themen 5
J Fenster wieder unsichtbar machen Java Basics - Anfänger-Themen 2
J Auslesen/speichern und wieder einlesen Java Basics - Anfänger-Themen 7
S Sound stoppen und nach Pause wieder abspielen Java Basics - Anfänger-Themen 6
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
I Zähler, der erst wieder zählt nachdem Pixel wieder andere Farbe hat Java Basics - Anfänger-Themen 2
B javax.ejb.Timer wieder starten? Java Basics - Anfänger-Themen 0
N Methode auslagern mal wieder Java Basics - Anfänger-Themen 8
F Inhalt einer Variable auswerten, die sich immer wieder ändert Java Basics - Anfänger-Themen 1
B ja ja schon wieder einer mit einer public static void main(string[] args) Frage... Java Basics - Anfänger-Themen 8
Bluedaishi for schleife um Dateien wieder zusammen zu fügen Java Basics - Anfänger-Themen 11
I SHA512 verschlüsseln und dann wieder auslesen? Java Basics - Anfänger-Themen 35
F Timer abbrechen und wieder starten Java Basics - Anfänger-Themen 5
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
B Listener beim Laden (deserialize) wieder hinzufügen bzw. mitspeichern? Java Basics - Anfänger-Themen 3
GadgetSofa .txt Datei erstellen und gleich wieder Löschen? Java Basics - Anfänger-Themen 12
D Bild für ein paar Sekunden einblenden und wieder ausblenden Java Basics - Anfänger-Themen 1
M Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 10
M Erste Schritte Tabelle aktualisieren (mal wieder) Java Basics - Anfänger-Themen 7
M Zahlen als Bytes in eine Datei speichern, daraus wieder auslesen Java Basics - Anfänger-Themen 2
D Schon wieder double -.- Java Basics - Anfänger-Themen 4
R Switch: Nach durchlaufen des Case wieder zum Menü Java Basics - Anfänger-Themen 3
K For Each Schleife wieder von Beginn an iterieren Java Basics - Anfänger-Themen 12
L Und schon wieder :=( Java Basics - Anfänger-Themen 3
T Arbeitsspeicher wieder freigeben Java Basics - Anfänger-Themen 21
Ernesto95 BufferedImage Teilbereich wieder transparent setzen Java Basics - Anfänger-Themen 16
J Schon wieder Rekursionsproblem Java Basics - Anfänger-Themen 3
S Erste Schritte Hochgescrolltes Menu nach MouseOut wieder "runter holen" Java Basics - Anfänger-Themen 3
H Datei in kleine Stücke teilen und wieder erkennen Java Basics - Anfänger-Themen 10
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
B Cookies auslesen und wieder schreiben Java Basics - Anfänger-Themen 2
T wieder mal Serialization :-) Java Basics - Anfänger-Themen 10
J Mal wieder ein kleines Toleranzproblem Java Basics - Anfänger-Themen 20
T text von textfeld auslesen und wieder reinschreiben Java Basics - Anfänger-Themen 10
T Benutzereingabe in form von string wieder ausgeben in JOptionPane Java Basics - Anfänger-Themen 14
F Input/Output ArrayList presistent speichern und wieder auslesen Java Basics - Anfänger-Themen 4
D Ausgegebene Worte wieder löschen. Java Basics - Anfänger-Themen 6
B Heap-Speicher wieder freigeben Java Basics - Anfänger-Themen 10
P Mal wieder JTable Java Basics - Anfänger-Themen 7
V Schon wieder ein kleines problem...dieses mal mit do-while loop Java Basics - Anfänger-Themen 9
M Mal wieder Probleme mit Date Java Basics - Anfänger-Themen 9
M Threads Thread ist nur kurz interrupted, dann wieder nichtmehr Java Basics - Anfänger-Themen 6
K Mal wieder ein Problem mit If / Else Java Basics - Anfänger-Themen 10
A Wie kann man etwas von Typ Image wieder löschen? Java Basics - Anfänger-Themen 7
J Threads Threads anhalten und wieder fortführen Java Basics - Anfänger-Themen 9
P Dropdownbox nach hinzufügen wieder öffnen Java Basics - Anfänger-Themen 7
A Daten speichern und wieder in ein Array laden Java Basics - Anfänger-Themen 4
B Datentypen Inhalt zum Iterator wieder aufrufen? Java Basics - Anfänger-Themen 10
Os-Programming Checkbox immer wieder überprüfen Java Basics - Anfänger-Themen 13
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
J Datei einlesen teile aus lines ändern und wieder rausschreiben. Java Basics - Anfänger-Themen 4
M String-Array-Element wieder null zuweisen Java Basics - Anfänger-Themen 16
K Wie kann ich aus jar Dateien wieder normale Klassen generieren? Java Basics - Anfänger-Themen 7
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Collections Datenbankdaten in einer Map speichern, bearbeiten, sortieren und wieder in Datenbank schreiben Java Basics - Anfänger-Themen 20
B Datentypen Werte in einen Array einlesen und danach die beiden höchsten Werte wieder ausgeben Java Basics - Anfänger-Themen 3
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
B Datei in mehrere Ordner splitten und wieder zusammenfuegen... Java Basics - Anfänger-Themen 3
R ARRAY/List die sich immer wieder von vorne neu auffüllt ? Java Basics - Anfänger-Themen 21
F OOP Wieder mal Zugriffsprobleme... (Lösung am Ende) Java Basics - Anfänger-Themen 11
M Dynamisches Casten mal wieder Java Basics - Anfänger-Themen 4
P Zwei Charakter als Paramter übergeben und wieder ausgeben Java Basics - Anfänger-Themen 10
D Array speichern und wieder aufrufen Java Basics - Anfänger-Themen 6
Dit_ Thread stoppen und wieder starten Java Basics - Anfänger-Themen 2
M AudioStream - wiederholen, pausieren und wieder starten Java Basics - Anfänger-Themen 2
U Threads - Beenden/ Wieder starten Java Basics - Anfänger-Themen 10
M Wieder in TxtFile speichern Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben