# if (Exception geworfen) then {} else {}



## julchen81 (6. Mrz 2008)

Hallo,

ich möchte den durch einen User in ein Textfeld eingegebenen Text prüfen. Es dürfen nur Zahlen eingegeben werden.

Meine Idee schaut bis jetzt folgendermaßen aus:

```
if (Integer.parseInt (tfL.getText()) wirft keine NumberFormatException) then {mache normal weiter} ...
```

(tfL heißt mein Textfeld)

Kann man so was in der if-Abfrage umsetzen? Wenn ja, bitte wie?

LG Julia


----------



## trazzag (6. Mrz 2008)

statt if... then... solltest du dir mal try... catch... angucken

EDIT: mehr dazu findest du hier.


----------



## julchen81 (6. Mrz 2008)

ja, try... catch kenne ich, aber ich wollte wissen, ob das auch mit if geht, weil mir das so komisch vor kam sonst... irgendwie war ich nicht zufrieden damit.

Allerdings läuft's jetzt problemlos mit try...catch, also passt!

Danke für deine Hilfe!

Julia


----------



## J.C. (6. Mrz 2008)

trazzag hat gesagt.:
			
		

> statt if... then... solltest du dir mal try... catch... angucken



Nein, sollte er nicht. Try catch sollte wirklich nur für ausnhame situationen verwenden. Eingaben des benutzers durch ne Exception abzufangen ist ganz schlechter Stil.

Geh den String zeichen für zeichen durch, mach nen char draus und prüfe mit isDigit(char ch) ob es eine zahl ist


MfG,
J.C.


----------



## gizmo (6. Mrz 2008)

Wie wärs damit?


```
public final class IntDocument implements Document {
        private Document document;

        private IntDocument(Document aDocument) {
            document = aDocument;
        }

        public void insertString(int someOffset, String someStr, AttributeSet anAttributeSet) throws BadLocationException {
            String tempInsertString = "";
            if (null != someStr) {
                tempInsertString = someStr.replaceAll("\\D", "");
            }
            document.insertString(someOffset, tempInsertString, anAttributeSet);
        }

        public void addDocumentListener(DocumentListener someListener) {
            document.addDocumentListener(someListener);
        }

        public void addUndoableEditListener(UndoableEditListener someListener) {
            document.addUndoableEditListener(someListener);
        }

        public Position createPosition(int someOffs) throws BadLocationException {
            return document.createPosition(someOffs);
        }

        public Element getDefaultRootElement() {
            return document.getDefaultRootElement();
        }

        public Position getEndPosition() {
            return document.getEndPosition();
        }

        public int getLength() {
            return document.getLength();
        }

        public Object getProperty(Object someKey) {
            return document.getProperty(someKey);
        }

        public Element[] getRootElements() {
            return document.getRootElements();
        }

        public Position getStartPosition() {
            return document.getStartPosition();
        }

        public void getText(int someOffset, int someLength, Segment someTxt) throws BadLocationException {
            document.getText(someOffset, someLength, someTxt);
        }

        public String getText(int someOffset, int someLength) throws BadLocationException {
            return document.getText(someOffset, someLength);
        }

        public void putProperty(Object someKey, Object someValue) {
            document.putProperty(someKey, someValue);
        }

        public void remove(int someOffs, int someLen) throws BadLocationException {
            document.remove(someOffs, someLen);
        }

        public void removeDocumentListener(DocumentListener someListener) {
            document.removeDocumentListener(someListener);
        }

        public void removeUndoableEditListener(UndoableEditListener someListener) {
            document.removeUndoableEditListener(someListener);
        }

        public void render(Runnable someR) {
            document.render(someR);
        }
    }

    // Anwendung:
    JTextField field = new JTextField();
    field.setDocument(new IntDocument(field.getDocument()));
```


----------



## chilla (6. Mrz 2008)

wäre es nicht einfach das ganze mit regex zu verwirklichen??

ps.:
"Nein, sollte er nicht." 

*eieiei*


----------



## Marco13 (6. Mrz 2008)

J.C. hat gesagt.:
			
		

> Nein, sollte er nicht. Try catch sollte wirklich nur für ausnhame situationen verwenden. Eingaben des benutzers durch ne Exception abzufangen ist ganz schlechter Stil.
> 
> Geh den String zeichen für zeichen durch, mach nen char draus und prüfe mit isDigit(char ch) ob es eine zahl ist



 :autsch: Also, für ints lass' ich mir das ja noch gefallen. Wenn man nur positive ints eingeben will. Bei negativen müßte man schon aufpassen, aber spätestens, wenn man floats in der Form -1.23e-4 oder 123.E3 damit verifizieren will, ist das doch krampfig. Dann macht man sich einfach eine Methode 
private static boolean isValid(String string) { ... }
und ruft die auf. Pragmatische (oder "vernünftige"?) Leute schreiben die dann einfach als

```
private static boolean isValid(String string) 
{ 
    float f = 0;
    try
    {
        f = Float.parseFloat(string);
    }
    catch (NumberFormatException e)
    {
        return false;
    }
    return (!Float.isInfinite(f) && !Float.isNaN(f));
}
```
und Masochisten überlegen sich, wie eine Regular Expression dafür aussehen muss. Wer ehrgeizig ist, möge seinen Vorschlag für diese Regular Expression bitte hier posten (aber nicht enttäuscht sein, wenn ich ihm den Fall nenne, wo sie ihm um die Ohren fliegt :wink: )


----------



## Wildcard (6. Mrz 2008)

Da kann ich Marco13 nur beipflichten. Gerade bei int drängt sich die NumberFormatException doch geradezu auf.


----------



## The_S (7. Mrz 2008)

J.C. hat gesagt.:
			
		

> Nein, sollte er nicht. Try catch sollte wirklich nur für ausnhame situationen verwenden. Eingaben des benutzers durch ne Exception abzufangen ist ganz schlechter Stil.



Halt ich für n Gerücht 



			
				J.C. hat gesagt.:
			
		

> Geh den String zeichen für zeichen durch, mach nen char draus und prüfe mit isDigit(char ch) ob es eine zahl ist



Na dann doch lieber sowas in die Richtung


```
if ("5323,53".matches("[\\-]{0,1}[0-9]*[\\.,]{0,1}[0-9]*")) {
   System.out.println("Double, bei dem ggf. noch ein ',' durch einen '.' zum Parsen ersetzt werden muss");
}
```


----------



## chilla (7. Mrz 2008)

ich würd das eh nie mit regex machen... wozu gibtz denn exceptions


----------



## JavaFred (7. Mrz 2008)

J.C. hat gesagt.:
			
		

> Try catch sollte wirklich nur für ausnhame situationen verwenden.


Fehlerhafte Eingaben sind DAS Positivbeispiel für Exceptions.


----------



## Marco13 (7. Mrz 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Na dann doch lieber sowas in die Richtung
> 
> 
> ```
> ...



Sollte das ein Versuch sein, auf meine Aufforderung einzugehen? (Wenn ja, muss man den wohl nicht so ernst nehmen :wink: )


----------



## Janus (8. Mrz 2008)

JavaFred hat gesagt.:
			
		

> Fehlerhafte Eingaben sind DAS Positivbeispiel für Exceptions.



was gegen die verwendung der exception als ausnahmebehandlung spricht ist allerdings, dass NFE eine runtime exception ist. runtime exceptions werden normalerweise nur dann verwendet, wenn es sich um programmierfehler handelt. eine IOException z.b. kann der entwickler im vorfeld nicht prüfen. wenn auf eine resource nicht zugegriffen werden kann, geht es halt nicht. einen string daraufhin zu prüfen, ob er auch tatsächlich eine parsbare zahl enthält, ist durchaus möglich. java beinhaltet nämlich eine exception vom typ ParseException, die hier aber nicht verwendet wurde.

allerdings steht hier der pragmatische ansatz ganz klar im vordergrund. NFE fliegt wirklich nur dann, wenn im string keine gültige zahl enthalten war. also fangen und eine entsprechende fehlerbehandlung vornehmen.


----------



## The_S (11. Mrz 2008)

Marco13 hat gesagt.:
			
		

> Sollte das ein Versuch sein, auf meine Aufforderung einzugehen? (Wenn ja, muss man den wohl nicht so ernst nehmen :wink: )



Nö, sollte man auch nicht so ernst nehmen :lol:


----------

