# Java Exceptions - Auf leeres Feld prüfen



## Zassam (14. Jan 2016)

Hallo, ich bin gerade dabei ein wenig mit Exceptions rum zu probieren. Leider bekomme ich immer einen Fehler bei meinem derzeitigen Programm.
Das sind meine Exceptions, dabei sind die Klassen LeeresFeldException und StundenException selbst programmiert.

```
try {
                    stunden = Integer.parseInt(tftStunden.getText());
                    minuten = Integer.parseInt(tftMinuten.getText());
                    if (stunden > 24 || stunden < 0) {
                        throw new StundenException("Bitte geben sie eine gültige Stundenzahl an.");
                    }
                    if (minuten > 60 || minuten < 0) {
                        throw new StundenException("Bitte geben sie eine gültige Minutenzahl an.");
                    }
                    if (String.valueOf(stunden).equals("") | String.valueOf(minuten).equals("")) {
                        throw new LeeresFeldException("Bitte füllen sie alle Felder aus");
                    }
                    txtAusgabe
                            .append("Ihre Uhrzeit beträgt: " + String.valueOf(stunden) + ":" + String.valueOf(minuten));
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                } catch (LeeresFeldException e) {
                    JOptionPane.showMessageDialog(null, e.getMessage());
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                } catch (StundenException e) {
                    JOptionPane.showMessageDialog(null, e.getMessage());
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "Bitte geben sie nur ganze Zahlen ein");
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                }
```
Hier StundenException:

```
package exceptions;

public class StundenException extends NumberFormatException {
    public StundenException() {
        super();
    }

    public StundenException(String s) {
        super(s);
    }
}
```
Und hier LeeresFeldException:

```
package exceptions;

public class LeeresFeldException extends NumberFormatException {
    public LeeresFeldException() {
        super();
    }

    public LeeresFeldException(String s) {
        super(s);
    }
}
```
Dabei greift StundenException und gibt auch die richtige Ausgabe aus. Aber wenn ich nichts eingebe greift die NumberFormatException anstatt die LeeresFeldException. Irgendwie krieg ich es nicht raus, erkenne gerade nicht den Fehler.
Danke schonmal für jede Hilfe 
mfg Nicklas


----------



## Tarrew (14. Jan 2016)

Die NumberFormatException wird geworfen bevor du überhaupt prüfen kannst ob der String kein Zeichen enthält.


```
stunden = Integer.parseInt(tftStunden.getText());
  minuten = Integer.parseInt(tftMinuten.getText());
```
Wenn in dem Stunden oder Minuten Feld keine Eingabe steht und du versuchst das zu parsen dann wird die Exception geworfen. Deswegen kommst du garnicht mehr bis zu deiner if-Abfage um die LeeresFeldException zu werfen.


```
if (String.valueOf(stunden).equals("") | String.valueOf(minuten).equals("")) {
      throw new LeeresFeldException("Bitte füllen sie alle Felder aus");
}
```
Diese if-Bedinung wird auch niemals wahr sein. valueOf(int) erwartet immer irgendeine Zahl und wird dir (soweit ich weiß) auch niemals den leeren String zurückgeben.


----------



## Zassam (14. Jan 2016)

Danke für deine schnelle Antwort. Also ist es schlicht unsinnig eine Exception für leere Felder zu schreiben? Oder gibt es einen Weg es mit einer Exception zu prüfen? Das mit String.valueOf habe ich nur getestet weil ich dachte da wäre ein Fehler. Hatte es vorher richtig, sorry


----------



## VfL_Freak (15. Jan 2016)

Moin,


Zassam hat gesagt.:


> ... Also ist es schlicht unsinnig eine Exception für leere Felder zu schreiben?
> Oder gibt es einen Weg es mit einer Exception zu prüfen? ...


ganz klar: *JA! *
Das ist ein bisschen wie mit Kanonen auf Spatzen zu schießen 

Natürlich kannst und darfst Du prüfen, ob ein String leer ist oder nicht, aber ggf. reicht doch ein einfacher Hinweis an den User!
_*
Exceptions*_ heißen auf gut Deutsch nicht umsonst _*Ausnahmefehler!!*_
https://de.wikipedia.org/wiki/Ausnahmebehandlung
Damit soll auf Fehler im Programmablauf oder bei Programmzuständen o. ä. hingewiesen werden, bspw. FileNotFound, IndexOutOfBounds, IO usw.

Um den User auf eine fehlende oder falsche Eingabe hinzuweisen, ist sowas der falsche Weg!
Da reicht doch ein einfacher Messagedialog!

Gruß Klaus


----------



## Zassam (15. Jan 2016)

Okay, danke dir für die ausführliche Information!  
Mfg Nicklas


----------



## Zassam (15. Jan 2016)

Hey Leute, sorry nochmal das ich damit nerve. Ich weiß das eine eigene Exception dafür unssinnig ist, aber wie kann ich den mit einer if anweisung prüfen ob die Felder leer sind, vorher greift doch schon die NumberFormatException und gibt die Ausgabe aus dem Catch block aus. Könnte man irgendwie eine eigene Ausgabe für leere Felder schreiben bevor die NumberFormatException greift?
Mein Quelltext sieht jetzt so aus: 


```
try {
                    stunden = Integer.parseInt(tftStunden.getText());
                    minuten = Integer.parseInt(tftMinuten.getText());
                    if (tftStunden.equals("") | tftMinuten.equals("")) {
                        JOptionPane.showMessageDialog(null, "Sie müssen alle Felder ausfüllen");
                        tftStunden.requestFocus();
                        tftStunden.selectAll();
                    }
                    if (stunden > 24 || stunden < 0) {
                        throw new StundenException("Bitte geben sie eine gültige Stundenzahl an.");
                    }
                    if (minuten > 60 || minuten < 0) {
                        throw new StundenException("Bitte geben sie eine gültige Minutenzahl an.");
                    }
                    txtAusgabe
                            .append("Ihre Uhrzeit beträgt: " + String.valueOf(stunden) + ":" + String.valueOf(minuten));
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                } catch (StundenException e) {
                    JOptionPane.showMessageDialog(null, e.getMessage());
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                } catch (NumberFormatException e) {
                    JOptionPane.showMessageDialog(null, "Bitte geben sie nur ganze Zahlen ein");
                    tftStunden.requestFocus();
                    tftStunden.selectAll();
                }
```


----------



## Tarrew (15. Jan 2016)

Erst den Text auswerten und dann parsen:

```
String stunden = tftStunden.getText();       
        if(stunden.equals("")){
            throw new LeeresFeldException("Bitte füllen sie alle Felder aus");
        }
        stunden = Integer.parseInt(stunden);
```


----------



## Zassam (15. Jan 2016)

Danke sehr. Dann funktioniert es aber wirklich nur mit der Exception, da sonst die If Anweisung und die NumberFomatException ausgegeben werden. Ich denke ich lasse es ganz weg und gebe mich mit der normalen Exception zufrieden. Danke euch für eure Hilfe ! 
Gruß Nicklas


----------



## Tarrew (15. Jan 2016)

#edit: Ja hab dich falsch verstanden.


----------



## Joose (15. Jan 2016)

Verschiebe die if-Bedingung doch einfach vor das Parsen des Inhalt der Textfelder 
Achtung: Wenn die if-Bedingung zutrifft musst du die Methode abbrechen, sonst läuft der Code natürlich weiter und wieder in die Exception.

EDIT: aktualisieren bevor man antwortet wäre praktisch  dann wäre meine Antwort gar nicht notwendig gewesen

EDIT2: 


Zassam hat gesagt.:


> Dann funktioniert es aber wirklich nur mit der Exception, da sonst die If Anweisung und die NumberFomatException ausgegeben werden.



Es funktioniert auch ohne Exception. Dein Problem: Wenn die if-Bedingung zutrifft wird der Code vom if ausgeführt, danach wird der Code nach dem if einfach weiter ausgeführt und somit passiert die NumberFormatException (wegen dem parse).
Du musst im if dafür sorgen das der Code nicht weiter ausgeführt wird:
Möglichkeit 1 wäre direkt am Ende des ifs ein "return;" zu schreiben damit wird die Methode an dieser Stelle verlassen.
Möglichkeit 2 den Code der nicht ausgeführt werden soll wenn die Felder leer sind werden in den else Zweig vom if geschrieben


----------



## Zassam (15. Jan 2016)

Danke, habe die Variante mit dem return eingeführt und funktioniert super! Danke habt mir sehr geholfen, danke für eure Bemühungen. Wünsch euch noch nen schönen Abend 
Gruß Nicklas


----------

