Java Quellcode Fehler

Hallo Leute,

ich habe ein Problem in meinem Taschenrechner mit Java.
Der Compiler zeigt mir einen Fehler an den ich nicht verstehe und somit nicht beheben kann.

Hier sind die Screenshots meines Programmes
(leider musste ich mehrere Screenshots von den einzelnen Klassen machen):

http://www.bilder-hochladen.net/files/jxi2-1-c4ca-pn…
http://www.bilder-hochladen.net/files/jxi2-2-c81e-pn…
http://www.bilder-hochladen.net/files/jxi2-3-eccb-pn…
http://www.bilder-hochladen.net/files/jxi2-4-a87f-pn…
http://www.bilder-hochladen.net/files/jxi2-5-e4da-pn…
http://www.bilder-hochladen.net/files/jxi2-6-1679-pn…
http://www.bilder-hochladen.net/files/jxi2-7-8f14-pn…
http://www.bilder-hochladen.net/files/jxi2-8-c9f0-pn…
http://www.bilder-hochladen.net/files/jxi2-9-45c4-pn…
http://www.bilder-hochladen.net/files/jxi2-a-d3d9-pn…
http://www.bilder-hochladen.net/files/jxi2-b-6512-pn…
http://www.bilder-hochladen.net/files/jxi2-c-c20a-pn…

Und hier die Fehlermeldung(leider auch 2 Screenshots):

http://www.bilder-hochladen.net/files/jxi2-d-c51c-pn…
http://www.bilder-hochladen.net/files/jxi2-e-aab3-pn…

Ich bedanke mich bereits im Vorraus und hoffe auf gute und hilfreiche Antworten.

mfg Maximilian Glumann

PS: Ich weiß leider nicht sicher ob die Links funktionieren und ob sie ganz in der richtigen Reihenfolge angeordnet sind (Ich hoffe aber, dass sie richtig angeordnet sind), weil dies erst meine 2.Frage hier ist und ich noch keine Links eingefügt hatte. Außerdem verwende ich auch die Bilder-Hochlade-Seite zum ersten Mal.

Moin,

Als erstes, es ist sehr aufwendig dir zu helfen, wenn du den Quelltext nur als Bilder hochlädst.

Nun zu deinem Fehler: Eine NullpointerException gibt es immer dann, wenn dein Programm mit einem Speicherbereich (z.B. Variable) was machen soll, aber dort noch nichts abgelegt wurde.
In deinem Fall ist dies in der Klasse b, Methode Rechnen (Zeile 38), die Variable Rechenzeichen2 ist noch nicht mit einem Wert gefüllt.

Mfg
Tim

Tag Maximilian,

die Fehlermeldung ist doch eindeutig: Rechenzeichen2 ist in Zeile 38 von b.java null und null kann man nicht mit einem String vergleichen.
Wenn dieser Hinweis nicht reicht, erstelle bitte ein SSCCE (http://sscce.org/), dann sehen wir weiter.

Gruß
Jörg

Hallo Tim,
danke für deine Antwort, aber Ich habe leider vergessen in meiner Frage zu erwähnen, dass ich das auch schon bemerkt habe (meine Schuld, trotzdem Danke),
aber Ich nicht weiß wie das sein kann, weil Rechenzeichen2 ja in ButtonintoTextfield1 und ButtonintoTextfield2 (beide in b) mit der Rechenart aus den ActionListenern (d und f) besetzt wird?
Und bezüglich meines Codes wusste ich nicht wie ich den bei wer-weiß-was einbringen kann und habe mich für die einzige Möglichkeit entschieden, die mir eingefallen ist. Könntest du mir vielleicht einen besseren Vorschlag machen? Denn dann könnte ich dir den Code nochmal so schicken.

mfg Maximilian

Hallo Jörg,

Ich bedanke mich für deine Antwort, aber ich habe leider vergessen in meiner Frage zu erwähnen, dass ich bereits weiß, dass dies das Problem ist, es aber für mich keinen Sinn gibt, weil Rechenzeichen2 in ButtonintoTextfield1 und ButtonintoTextfield2 (beide in b) mit Rechenart aus den ActionListenern d und f besetzt wird.
Und danke für den Tipp mit dem sscce, aber das ist doch ein extremer Aufwand, oder?

mfg Maximilian

Hallo,

ich schaue mir dein Problem gerne noch ein mal an. Aber bitte laden dazu deinen Quellcode als Text hoch. Entweder als Datei oder direkt hier im Forum.

Hier findest du etwas zum Eingeben von Quellcode:
http://www.wer-weiss-was.de/app/faqs/4/3090

Auch solltest du sprechende Namen für deine Klassen benutzen. E oder C sagen nicht besonders viel über die Funktion der Klasse aus.

mfg Tim

Hallo,

Nochmals herzlichen Dank für deine Hilfsbereitschaft.
Ich habe meinen Quellcode als Dokument hochgeladen:

http://www.doktus.de/dok/63285/taschenrechner-doc.html

Du kannst es dir unter diesem Link online anschauen oder als .pdf, .txt oder .doc kostenlos herunterladen

Ich hoffe, dass du mir behilflich sein kannst

mfg Maximilian

Morgen Maximilian,

> … es aber für mich keinen Sinn gibt, weil Rechenzeichen2 … mit Rechenart aus den ActionListenern d und f besetzt wird.

Offenbar nicht (immer), sonst würde die NPE ja nicht geworfen.

Bezüglich SSCCE geht es natürlich schneller, einfach seinen kompletten Code zu posten. Aber wer von den Helfern hat schon Lust und Zeit, Seiten von Code zu lesen, erst recht wenn Vieles davon mit dem Problem gar nichts zu tun hat. Ich finde es völlig in Ordnung als Fragesteller dem Helfer soviel Arbeit wie möglich abzunehmen. Zudem ist meine Erfahrung, dass die Chance einer kompetenten Antwort auf ein SSCCE um ein Vielfaches höher liegt als auf unvorbereiteten Code. Ein SSCCE kann man, wenn einen das Problem interessiert, notfalls selbst kompilieren und testen, bis es läuft. (Das setzt allerdings das Posten als kopierbaren Text und nicht als Image voraus.) Außerdem habe ich es oft erlebt, dass beim Strippen meines Codes auf ein SSCCE ich selbst auf die Lösung gekommen bin.
Also, frisch auf!

Moin,

ich stelle einfach mal die Vermutung an, dass dies eines deiner ersten Java bzw. objektorientierten Programme ist. Es enthält leider einige Fehler und ist auch nicht besonders sinnvoll aufgebaut. Alles im Detail zu besprechen wäre an dieser Stelle etwas viel… Dafür gibt es Bücher :wink:

Wenn es sich nicht um ein Schulprojekt oder ähnliches mit einem Abgabgetermin handelt, dann würde ich dir dringend raten etwas kleiner und ohne GUI anzufangen, um erst ein mal dir Grundzüge der OO-Prgrammierung zu verstehen.
Auch solltest du dir unbedingt einmal die bestehenden Absprachen bei der Formatierung des Java-Codes anschauen z.B. dass Methoden immer mit kleinen Buchstaben beginnen und neue Wörter einen Großbuchstaben haben. (addButton())

Solltest du Termindruck haben, dann schreib doch mal, was der Rechner alles könne soll. Wenn es nicht zu aufwendig ist, würde ich dir ein Gerüst zur Verfügung stellen, mit dem du weiter arbeiten kannst.

mfg Tim

Hallo Jörg,

ich würde mir gerne die Mühen machen dir ein SSCCE zur Verfügung zu stellen, aber ich mache es so ähnlich und schreibe ein sehr kleines Programm nur mit diesem Problem. Ich gebe dir dann Bescheid wenn ich dies geschrieben habe und bis dahin kannst du ja schon mal in meinem kompletten Programm ein bisschen herumschnuppern (als kopierbarer Text):

http://www.wer-weiss-was.de/app/faqs/4/3090

mfg Maximilian

Hallo Tim,

was Java angeht bin ich zwar noch kein Profi aber auch kein blutiger Anfänger mehr. Ich habe schon eine Menge Programme ohne GUI geschrieben welche alle mit etwas ausprobieren funktioniert haben (unter anderem einen Taschenrechner)
Und bezüglich der Absprachen: Ich weiß, dass es sie gibt und ich kenne die meisten eigentlich auch, aber dieses Programm sollte eigentlich bloß ein Programm werden in dem ich GUI verwende um im Umgang mit GUI besser zu werden und gelernte Befehle anzuwenden. daher dachte ich mir, dass es nicht ganz so wichtig ist.
Ich wäre dir echt dankbar, wenn du mir mal zumindest die schlimmsten Fehler als Liste schreiben würdest, dass ich sie verbessern und in Zukunft vermeiden kann und ich würde immer noch gerne Wissen wieso Rechenzeichen2 nicht mit Rechenart aus den ActionListenern besetzt wird, weil dies der Fehler ist wieso es nicht funktioniert.
Ich hoffe, dass du mir meine Fehler auflisten kannst

mfg Maximilian

Hallo Jörg Ich habe mal ein ganz kurzes Programm geschrieben, welches allerdings funktioniert (dieses Programm hat allerdings keinen ActionListener kann das vielleicht der Grund sein??)

http://www.doktus.de/dok/63286/test.html

Ich hoffe du kannst mir helfen

mfg Maximilian

Hallo Jörg,

Hier ist dein SSCCE:

http://www.doktus.de/dok/63288/sscce-fuer-taschenrec…

Ich habe das Problem so weit wie möglich eingegrenzt

mfg Maximilian

Hallo,

also ich kann dir zumindest sagen, dass du die Bilder richtig hochgeladen und verlinkt hast.
Aber warum hast du nicht gleich den Code hochgeladen?

Bitte gewöhne dir auch an dich an Coding convetions zu halten und Klassennamen generell mit großem Anfangsbuchstaben (b, c usw.) und variablen generell mit kleinem Anfangsbuchstaben (N2, Rechenzeichen2). Auch sollten die Klassen/Variablen sprechende Namen besitzen. Niemand kann sich etwas unter der Klasse b vorstellen. Was tut sie, was macht man mit ihr?
Und warum heißt Rechenzeichen2 so? Wo kommt die 2 her? Wo ist Rechenzeichen1?

Die Java Coding Convetions gibt es unter folgender Adresse: Java Coding Convetions

So ist es wirklich sehr mühsam sich durch diesen Code zu hangeln und den Fehler zu finden. Das erschwert sich noch mehr, da es Screenshots sind.

Ich kann dir nur sagen, dass Rechenzeichen2 zu diesem Zeitpunkt der Ausführung null ist. Am besten setzt du einen Breakpoint bei Zeile 82 in e.java und schaust wie dort die Variablen übergeben werden.

Moin, Moin,

es gibt in Java eine Code-Konvention, dass Klassennamen mit Majuskeln und Variablennamen mit Minuskeln beginnen. Das als Erstes. Tunlichst vermeiden würde ich auch das benutzen bestehnder Klassennamen als Variablen („d ActionListener= …“).
Dass Du bei der Erstellung eines SSCCE einmal eine fehlerfreie Version hattest, ist doch prima. So kann man dann im schrittweisen Ergänzen sehen, ab wann/wodurch der Fehler auftritt.
Da Dein Beispiel nicht kopierbar ist, habe ich es bei mir nicht laufen lassen. In welcher Zeile tritt der Fehler jetzt auf?

Hallo Jörg,

Das mit den Code-Konventionen weiß Ich ich tue mir bloß noch schwer sie umzusetzen, weil ich beim schreiben nie daran denke (Ich weiß, dass ich mir sie dennoch dringend angewöhnen sollte).

Und bei den SSCCEs (das 1.funktioniert und das 2. funktioniert nur, weil ich Hallo2 nicht überprüfe (mit einer if-Bedingung, o.ä. sondern nur ausgebe (sonst würde wieder die NPE kommen)

Und zum kopieren des Codes kannst du dir einfach (und natürlich kostenlos) unter demselben Link herunterladen (als .pdf .txt und .doc)
(auf der linken Seite des Dokuments und ungefähr in der Mitte des Dokuments sind die Download-Buttons)

Hallo,

erstmal Danke für deine Antwort.
Zu den Screenshots und Links: Es ist gut, dass sie in der richtigen Reihenfolge sind (hab ich gleich nach dem Frage stellen auch ausprobiert) und ich wusste zunächst nicht wie ich den Code direkt hochladen könnte, hab es aber nochmal als Dokument hochgeladen:

http://www.doktus.de/dok/63285/taschenrechner-doc.html

ein sehr stark verkürztes Programm (ohne ActionListener), welches funktioniert:

http://www.doktus.de/dok/63286/test.html

ein SSCCE (Eingrenzung des Problems durch verkürzen des Programmes) (mit ActionListener) , welches allerdings nur funktioniert, weil ich Hallo2 (so heißt Rechenzeichen2 im SSCCE) nicht überprüfe (durch eine if-Bedingung, o.ä. sondern bloß ausgebe sonst käme wieder die NullPointerException):

http://www.doktus.de/dok/63288/sscce-fuer-taschenrec…

Wenn du die eben aufgelisteten Programme selbst einmal laufen lassen willst, musst du sie dir erst herunterladen (als .pdf .txt und .doc und die Download-Buttons sind auf der linken Seite des Dokumentes und ungefähr in der Mitte des Dokumentes), da du den Code sonst nicht kopieren kannst (der Download ist natürlich kostenlos)

Dass Rechenzeichen2 eine 2 hat liegt daran, dass ich es ursprünglich Rechenart2 nennen wollte (Rechenart gibt es bereits in den Klassen d und f) mir ist allerdings noch nie aufgefallen, dass ich aus Versehen Rechenzeichen geschrieben habe ich werde es ausbessern (allerdings nicht in den hochgeladenen Dokumenten, da ich sie sonst ganz neu hochladen müsste und das wäre zu aufwändig (denke dir einfach Rechenart2 anstatt Rechenzeichen2, OK?))

Die meisten der Coding Conventions kenne ich, ich tue mir aber schwer daran zu denken, wenn ich schreibe (Ich gebe mir mühe in Zukunft daran zu denken und der Link ist praktisch, denn dann habe ich nochmal alle auf einen Blick)

Ich habe leider vergessen in der Frage zu erwähnen, dass ich weiß, dass das Problem ist, dass Rechenzeichen2 bei der Überprüfung null ist und ich mir das bloß nicht erklären kann warum das so ist, da Rechenzeichen2 doch mit Rechenart aus d bzw. später f besetzt wird (Ich glaube bei den Screenshots gibt es noch keine Klasse f schaue dir dazu den 1. Link von oben an)

Als letztes würde ich gerne noch wissen wie man einen Breakpoint setzt und ob du es mir vielleicht erklären könntest?

Ich hoffe, dass du mir helfen kannst und nochmals Danke im Vorraus

mfg Maximilian

Moin,

hab es gestern noch nicht geschafft. Melde mich heute Abend…

mfg Tim

Hallo Tim,

Das ist gar kein Problem und Danke für deinen Aufwand für mich

mfg Maximilian

Hallo,

die Coding Conventions helfen dir und jedem der deinen Code liest. Das Programm ist zum Glück nicht so groß und man kapiert was nacheinander passiert.

Einen Breakpoint setzt man, indem man bei den Zeilennummern im Editor in derjenigen Zeile doppelt klickt bei der die Ausführung pausieren soll. Es erscheint dann ein kleiner blauer Punkt. Ich nehme an du benutzt Eclipse. Dann führst du das Programm im Debugmodus aus und die Ausführung hält bevor die Zeile ausgeführt wird, in der der Breakpoint gesetzt ist.

Nun zu deinem Problem:
In Klasse f legst du in Zeile 84 ein neues Objekt b an. In dessen Konstruktor passiert nichts (es gibt ja auch keinen) und so bleibt das Feld Rechenzeichen2 unbesetzt, also null. Nun besetzt du b1 und b2 aus der dem ActionListener-Objekt f. Dann rufst du b.Rechnen(b2) auf.
Da ist klar, dass Rechenzeichen2 immer noch null ist, weil du das Feld dieses Objekts nicht setzt.

In diesem Codeteil fehlt also die Zuweisung der Rechenart.