Java wo liegt der Fehler?
Hallo gutefrage-Community,
ich habe unten gezeigten Quellcode verfasst und dabei keinerlei Fehlermeldungen oder Exceptions erhalten. Am Ende kommt aber irgendwie trotzdem nicht heraus, was herauskommen soll.
Was ich erwarte:
Aus einem JTextField erhält man einen String "input" wie z.B. 2x+5=10x-3. Dieser wird zuerst beim "=" gesplittet. Daraus erhält man ein Array mit zwei Strings: 2x+5 und 10x-3. Diese beiden Arrays sollen nun an allen "+" und "-" gesplittet werden. Deshalb wird eine Schleife zweimal durchlaufen und dabei im ersten Durchlauf der erste und im zweiten Durchlauf der zweite String verarbeitet. Danach wird bei jeder Zahl mit "x" das "x" entfernt und ein boolean auf true gesetzt. Was am Ende herauskommen soll:
Drei Arrays (int num[], boolean isFactorOfVar[] und boolean isOnRightSide[]), die immer dem gleichen Index entsprechen, also: num[0] gehört zu isFactorOfVar[0] und zu isOnRightSide[0], num[1] gehört zu isFactorOfVar[1] und zu isOnRightSide[1] usw. Dabei soll num[] der Zahl entsprechen, isFactorOfVar, ob ein x am Ende entfernt wurde und isOnRightSide[], ob sich diese Zahl auf der rechten Seite des "=" befindet. Hier ist das am Anfangsbeispiel 2x+5=10x-3 gezeigt:
- num[0] = 2; isFactorOfVar[0] = true; isOnRightSide[0] = true
- num[1] = 5; isFactorOfVar[1] = false; isOnRightSide[1] = true
- num[2] = 10; isFactorOfVar[2] = true; isOnRightSide[2] = false
- num[3] = 3; isFactorOfVar[3] = false; isOnRightSide[3] = false
Was herauskommt:
- num[0] = 2; isFactorOfVar[0] = true; isOnRightSide[0] = nicht angezeigt
- Fehlermeldung
Mein Code:
Fehlermeldung:
2 Antworten
Leider zeigst du nur einen Teil deines Codes, was die Analyse nicht eben vereinfacht. Interessieren würde mich, welche Feldgrenzen du für die drei Felder festgelegt hast.
Höchst verdächtig finde ich aber in Zeile 123 diese Passage:
for (int i : num) { ..... }
Wenn in num einer der Werte etas größer ist, könntest du da schnell eine Feldgrenzenüberschreitung erhalten.
Führe mal folgendes Programm aus, um zu verstehen, was diese Anweisung überhaupt tut:
int[] myNum = {10, 20, 30, 40};
for (i in myNum) { System.out.println(i); }
Beim Ausgeben machst du einen Fehler:
for(int i : num)
Das wird dir die Variable "i" auf den Wert setzen, der in "num" gespeichert ist, nicht auf den Index.
Demnach greifst du dann auf einen Index zu, der womöglich nicht existiert.
Da würdest du aber eine andere Exception bekommen.
Die Exception, die du erhälst, passt dazu, dass irgendwo ein Wert "null" ist, auf den aber zugegriffen wird.
Um diesen zu finden kannst du folgendes tun:
Entweder nutzt du einen Debugger, der dir dann direkt die Stelle liefert, an der der Fehler auftritt, sodass du prüfen kannst,w elcher Wert "null" ist.
Oder du suchst die entsprechende Stelle, beispielsweise indem du Ausgaben schreibst und schaust, ab welcher Stelle keine Ausgabe mehr kommt, sondern die Exception.
Evtl. kann dir die Exception hier auch irgendwie sagen, wo sie auftrat (ist die dort angegebene Stelle "Zeile 89" plausibel?).
Wenn du die Stelle gefunden hast, dann gibst du dir dort beteiligte Variablen aus und schaust, welche "null" sind. (wenn das tatsächlich die Zeile 89 ist, dann hast du den Array "num" nicht initialisiert (und die anderen Arrays evtl. auch nicht). Du möchtest and ieser Stelle evtl. auch lieber dynamische Datenstrukturen wie z.B. ArrayLists verwenden.)
Im Übrigen: Was du mit deinem programm anstellen möchtest ist etwas, was sich nicht derart einfach gestaltet, wie du es dir evtl. vorstellst, und wofür es spezielle Tools gibt, mit denen man soetwas handeln kann.
Sogenannte Parser-Generatoren erlauben es, Grammatiken zu definieren, beispielsweise solche wie für numerische Ausdrücke hier, und dann einen Parser zu generieren, der dir eine solche Eingabe wie hier in ihre Einzelteile aufteilt und diese z.B. in einen baum einordnet.
Dabei kann z.B. eine Operator-Präzedenz definiert werden, Assoziativität, und es kann sichergestellt werden, dass das Parsen des Ausdrucks auch tatsächlich funktioniert (was bei verschachtelten Ausdrücken je nach Parser durchaus problematisch sein kann).
Antlr und Yacc sind bekannte solche Tools. Xtext verwendet unter anderem Antlr und bietet weitere Features.