Java ArrayList Zuweisung und try-catch Block

Pennerschwert

Commodore
Registriert
Mai 2011
Beiträge
4.186
Liebes Forum,

ich bin gerade dabei zu Übungszwecken einen Budgetplaner zu programmieren. Grob gesagt, soll das Teil Kosten- und Einnahmenposten einlesen und später noch verrechnen.

Die Stelle an der es hakt hat mit dem ExceptionHandling zu tun, falls der Benutzer keinen Double Wert eingibt, sondern zb. "abc". Meine Vorgehensweise war bis jetzt, dass ich die "NumberFormatException" per Try-Catch Block abfange, dann eine Fehlermeldung (mit Anweisung zur richtigen Eingabe) ausgebe und abschließend die Eingabe neu starte. Allerdings werden immer nur die Eingaben des ersten Versuchs angenommen.

In Bildern:

Hauptfenster.PNGEingabe.PNGFehler.PNG

Bei Klick auf "Versuchen sie es nochmal" soll das Eingabe Fenster erneut aufgerufen werden und die Eingabe wiederholt werden.

Der Code, der bei Klick auf weiter ausgeführt wird:
Code:
//Instanziere neue Objekte der Klasse WiederholteFinanztransaktion
        WiederholteFinanztransaktion lohn = new WiederholteFinanztransaktion();
        WiederholteFinanztransaktion bafög = new WiederholteFinanztransaktion();
        WiederholteFinanztransaktion kapitaleinkünfte = new WiederholteFinanztransaktion();
        WiederholteFinanztransaktion unterhalt = new WiederholteFinanztransaktion();
        WiederholteFinanztransaktion sonstigeEinnahmen = new WiederholteFinanztransaktion();

        //Lese die Eingaben aus den jTextFields, wandle diese in Double um und speichere sie in der Betragsvariable der jeweiligen Objekte
        try {
            lohn.setFinanzTransaktionen(Double.parseDouble(gehaltUI.getText()));
            bafög.setFinanzTransaktionen(Double.parseDouble(bafögUI.getText()));
            kapitaleinkünfte.setFinanzTransaktionen(Double.parseDouble(kapitaleinkünfteUI.getText()));
            unterhalt.setFinanzTransaktionen(Double.parseDouble(unterhaltUI.getText()));
            sonstigeEinnahmen.setFinanzTransaktionen(Double.parseDouble(sonstigesUI.getText()));
        } catch (NumberFormatException e) {
            //Setze Eingaben auf 0 und starte anschließend die Eingabe erneut
            lohn.setFinanzTransaktionen(0);
            bafög.setFinanzTransaktionen(0);
            kapitaleinkünfte.setFinanzTransaktionen(0);
            unterhalt.setFinanzTransaktionen(0);
            sonstigeEinnahmen.setFinanzTransaktionen(0);

            //Erzeuge neues Fehlerfenster
            FalscheEingabeEinnahmen fehler = new FalscheEingabeEinnahmen();
            fehler.setVisible(true);
            this.dispose();
        }

Der Code der bei "Versuchen sie es nochmal ausgeführt wird:

Code:
private void wiederholeMouseClicked(java.awt.event.MouseEvent evt) {                                        
    
        BudgetPlanerEinnahmenUI fehler = new BudgetPlanerEinnahmenUI();
        fehler.setVisible(true);
        this.dispose();
        
    }


Vielleicht kann mir ja einer von euch helfen oder mir eine elegantere Methode zur Behandlung der Exception beschreiben. Falls noch mehr vom Code gebraucht wird oder etwas unklar ist, einfach sagen.
Leider zerschießt die Code Funktion des Foums, die Formatierung ein wenig.

Und in Zukunft wird natürlich ausschließlich in Englisch programmiert, vielleicht ändere ich das auch noch. Wichtiger ist mir aber erstmal, dass es das tut, was ich will :)

Edit: Ich sehe grade, dass der Titel falsch, ich wollte schon vor ein paar Tagen etwas fragen, bin dann aber selber auf die Lösung gekommen. Scheinbar hat er als ich ausversehen auf "vorher getippten Text wiederherstellen" (oder so ähnlich) geklickt habe, den Titel mitgeändert :/
 
Zuletzt bearbeitet:
Hi,

du kannst bei der Textbox einen Key-Pressed oder Keydown-Event registieren (genauso wie mit "wiederholeMouseClicked") und mit den Parametern im Event prüfen ob die Eingabe eine Zahl ist. Somit kannst du schon im vorneherein prüfen ob die eingabe überhaupt gültig ist. Es gibt denke ich auch ein cancle oder prevent im Event, sodass die eingabe erst garnicht auf der oberfläche angezeigt wird.

Außerdem: Warum rufst du immer this.dispose() auf? Damit machst du die aktuelle Instanz deines Fensters ungültig. Sowas sollte wenn überhaupt in deine "Close()" Methode falls vorhanden.


Gruss
 
Zuletzt bearbeitet:
Ich merke schon, ich muss das ganze nochmal etwas überarbeiten.

this.dispose() rufe ich auf um das aktuelle Fenster zu schließen, an sich benötige ich das später ja auch nicht mehr. Ich lese die Daten ein und speichere sie in eine ArrayList.

Meinst du mit Keydown-Event, dass die eingabe erstmal per Enter oder einer anderen Taste bestätigt werden soll ?
 
Depp_vom_Dienst schrieb:
this.dispose() rufe ich auf um das aktuelle Fenster zu schließen, an sich benötige ich das später ja auch nicht mehr.

Kann man so machen. Ich nutze eine Factory zum Erstellen von Dialogen und setze dort die gewünschte Aktion zum Beenden (DISPOSE_ON_CLOSE). Dann wird automatisch aufgeräumt, wenn der Dialog geschlossen wird.

Depp_vom_Dienst schrieb:
Meinst du mit Keydown-Event, dass die eingabe erstmal per Enter oder einer anderen Taste bestätigt werden soll ?

Üblicherweise nutzt man einen DocumentListener, da man damit alle Eingaben erschlagen kann. Gerne auch mit Timer, damit nicht jede Änderung sofort eine Überprüfung triggert.

Swing bietet aber auch eine Klasse, die Dir Arbeit abnimmt, falls das Modell für Dich passt: http://docs.oracle.com/javase/7/docs/api/javax/swing/InputVerifier.html. Hier wird überprüft, wenn der Fokus sich ändern würde. Das reicht meist. Gibt natürlich auch Libs, die noch viel mehr bieten, falls Du möglichst wenig Code selbst schreiben möchtest.

Kleiner Tipp noch: ich würde Klassen, die einen Dialog repräsentieren auch entsprechende benennen, dadurch wird IMHO der Code besser verständlich.
 
Danke für die Tipps, mittlerweile habe ich es auch hinbekommen, das es so läuft, wie ich es mir vorstelle.

Natürlich ist mir bewusst, dass meine Code Qualität noch zu wünschen übrig lässt und ich werde selbstverständlich auch daran arbeiten. Hauptziel der Übung war aber vor allem das Objektkonzept von Java besser zu verstehen und das ist einigermaßen gelungen denke ich.
 
Nimm einen REGEX und prüfe ob es passt oder nicht.
Exceptions benutzt man nur als allerletztes Mittel, aber nicht um Funktionalität einzubauen.

Regex für eine Zahl bzw. auch Double: [0-9]+(?:\.[0-9]+)*
Regex für exakt ein Double: [0-9]+\.[0-9]+

+ heißt 1 Zeichen oder mehrere, * heißt 0 bis unendlich Zeichen.
Der \ entwertet den . weil der Punkt als Regex sonst ein beliebiges Zeichen repräsentiert.
?: verhindert dass eine Gruppe gespeichert wird, da das Resultat jeder Klammer sonst als Variable abgelegt wird.

http://www.tutorialspoint.com/java/java_regular_expressions.htm

Try-catch ist dann zum absichern ok, aber nicht mehr nötig.
Wenn es dem REGEX matcht weiter, wenn nicht dann Error.
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben