NullPointerException - HILFE!!

Status
Nicht offen für weitere Antworten.

Floh

Mitglied
In meinem kleinen Rechenprogramm kommt in der Konsole eine java.lang.NullPointerException. Deshalb kann der Button nicht ausgeführt werden.


SQL:
private JButton getBtKorrigieren() {
		if (btKorrigieren == null) {
			btKorrigieren = new JButton();
			btKorrigieren.setBounds(new java.awt.Rectangle(180,300,121,46));
			btKorrigieren.setText("Korrigieren");
			btKorrigieren.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.out.println("actionPerformed()"); 
					// TODO Auto-generated Event stub actionPerformed()
					
					

						rechnung1.ergebnisPlus= Integer.parseInt(tfergebnisPlus.getText());
						rechnung1.ergebnisMinus= Integer.parseInt(tfergebnisMinus.getText());
						rechnung1.ergebnisMal= Integer.parseInt(tfergebnisMal.getText());
						rechnung1.ergebnisGeteilt= Integer.parseInt(tfergebnisGeteilt.getText());
						rechnung1.rest= Integer.parseInt(tfRest.getText());
					
					    
					rechnung1.korrekturBerechnen();
		
					}
				});
			}
		
		return btKorrigieren;
		}



und in einer anderen Klasse ist die Methode angelegt:

SQL:
public void korrekturBerechnen(){
			
				if (ergebnisPlus ==z1+z2){
					fenster1.smileyPlus.setText(":)");
					}  else {fenster1.smileyPlus.setText(":( "+(z1+z2));	
					}
}

Wisst ihr woran es liegen könnte??
 
was hat das mit dem Umstand, ob rechnung1 null ist oder nicht, zu tun?
rechnung1 ist eine Variable, die ein Objekt der Klasse Rechnung enthalten kann, aber genausogut auch nicht, dann enthält sie null/ nix
 
public static Berechnung rechnung1 = new Berechnung();

^ das habe ich eingegeben, ist es dann immer noch null?
 
dann wohl nicht,
im Zweifel auch leicht zu prüfen:

zu Beginn des ActionListeners
System.out.println("rechnung1 ist: "+rechnung1);

-----

wenn nicht rechnung1, dann vielleicht tfergebnisPlus

neue These also:
tfergebnisPlus ist null


kannst du auch wieder prüfen, die Exception sollte eine genaue Zeilennummer liefern,
schaue dir alle Objekte an, die in dieser Zeile benutzt werden
 
Mein Programm liest das eingegebene Ergebniss aus, wandelt es dann in einen Integer um und schaut dann ob es mit dem richtigen Ergebnis übereinstimmt. Deshalb kann ergebnisPlus nicht null sein. Und kurz vorher sage ich noch " smileyPlus.setText("");", deshalb ist smileyPlus eigentlich auch nicht null 🙁
Könnte es vielleicht noch was anderes sein?
 
> Und kurz vorher sage ich noch " smileyPlus.setText("");",

das klingt, als wüßtest du, wo der Fehler auftritt, dann kannst du doch wie von mir vorgeschlagen alle Objekte prüfen?

ansonsten gibts nur eine Methode:
System.out.println("zeile 20");
IF (ergebnisPlus ==z1+z2){
System.out.println("zeile 21");
fenster1.smileyPlus.setText(": )");
System.out.println("zeile 22");
} else {
System.out.println("zeile 23");
fenster1.smileyPlus.setText(": ( "+(z1+z2));
System.out.println("zeile 24");
}
System.out.println("zeile 25");


usw. im ganzen Programm,
zur weniger aufwendigen Eingrenzung reicht es zunächst, nur zu Beginn + Ende aller Methoden eine Ausgabe zu schreiben
 
hast du schonmal was von einem debugger gehört?
und in welcher Zeile fliegt der NullPointer?
 
nein, von debugger hab ich noch nichts gehört.

ich hab das jetzt mal getestet, und das programm läuft ohne probleme, bis die methode korrekturBerechnen() aufgerufen wird. das heißt der Fehler kommt erst hier auf:

SQL:
public void korrekturBerechnen(){
			
			
			
				if (ergebnisPlus ==z1+z2){
					fenster1.smileyPlus.setText(":)");
					}  else {fenster1.smileyPlus.setText(":( "+(z1+z2));	
					}
				
				if (ergebnisMinus ==z3-z4){
					fenster1.smileyMinus.setText(":)");
					} else {fenster1.smileyMinus.setText(":( "+(z3-z4));
					}
				
				if (ergebnisMal ==z5*z6){
					fenster1.smileyMal.setText(":)");
					} else {fenster1.smileyMal.setText(":( "+(z5*z6));
					}
				
				if (ergebnisGeteilt == z7/z8 &
					rest == z7%z8){
					fenster1.smileyGeteilt.setText(":)");
					} else {fenster1.smileyGeteilt.setText(":( "+(z7/z8)+", "+(z7%z8));
					}
							
			
		}

aber ich weiß einfach nicht was falsch ist 🙁 weil ich hatte es erst alles in der Hauptfensterklasse und da hat noch alles geklappt. und seit ich noch eine Fachklasse gemacht hab, kommt dieser Fehler. Das ist doch komisch??
 
komisch ist, wieso du die klaren und kinderleichten Möglichkeiten zur Fehlerfindung nicht nutzt,
oder bei Nichtverständnis nicht genauer hinterfragst
 
poste doch bitte einfach mal die fehlermeldung, den ganzen stacktrace bitte
 
wenn ich nicht weiß was ein debugger ist, woher sollte ich dann wissen dass es anscheinend zur fehlerfindung hilfreich ist?? ^^

hier ist die komplette fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
actionPerformed()
at fachklassen.Berechnung.korrekturBerechnen(Berechnung.java:87)
at fensterklasse.Hauptfenster$2.actionPerformed(Hauptfenster.java:225)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
ersetze Zeile 87 durch
System.out.println("fenster1 ist "+fenster1);
System.out.println("fenster1.smileyPlus ist "+fenster1.smileyPlus);
fenster1.smileyPlus.setText(": )");

sind derart einfache Befehle so abwegig?
 
ja wenn ich des einsetzt, dann überspringt er den fehler und die fehlermeldung zeigt wieder den gleichen fehler an nur ne zeile weiter ...
in dieser zeile : fenster1.smileyPlus.setText("🙁 "+(z1+z2));

aber die ausgabe im label smileyPlus erfolgt nicht.
 
genau hinschauen, die System.out.printlns können auch nach oder mitten in der Fehlermeldung kommen,
benutze System.err statt System.out, dann ist die Reihenfolge vielleicht besser;
System.err.println("fenster1 ist "+fenster1);
System.err.println("fenster1.smileyPlus ist "+fenster1.smileyPlus);

sichtbarer wirds auch mit
System.err.println("aaaaaaaaaaaaaaaaaaaa fenster1 ist "+fenster1+" aaaaaaaaaaaaaaaaaaaaaaaaaa);

und dann gibts noch die Möglichkeit, die Exception selber zu verschönern
Java:
try {
   System.err.println("fenster1 ist "+fenster1);
   System.err.println("fenster1.smileyPlus ist "+fenster1.smileyPlus);
   fenster1.smileyPlus.setText(": )");
} catch(NullPointerException e) {
   System.out.println("NPE, fenster1 ist: "+fenster1);
   if (fenster1 != null) {
       System.out.println("NPE, .smileyPlus ist "+fenster1.smileyPlus);
   }
   System.exit(0); // lieber nicht weitermachen
}

---------

in jedem Fall wird wohl eine der beiden Variablen null sein,
nun gilt es weiter zu forschen, wer setzt diese Variablen, warum sollte man sich sicher sein, dass sie != null sind?
die entsprechenden Codestellen auch mit System.out.println verstehen und/ oder hier posten,
am besten komplett lauffähiges Programm
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben