studyklar
GdI 2 · Übungsblatt 8 · Aufgabe 3

Ist dieser Text eine ganze Zahl? Prüfen mit NumberFormatException

Ist "-15" eine ganze Zahl? Und "9.5"? Statt jedes Zeichen selbst zu prüfen, lassen wir Java die Umwandlung versuchen und beobachten, ob es klappt. Rechts steht das fertige Programm, die Zeilen zum aktuellen Schritt sind hervorgehoben. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 3

Wenn man einen String mit Integer.parseInt( ) in einen int umwandelt, dann muss der Inhalt des Strings auch tatsächlich ein int sein (z. B. „-15“). Es soll eine Methode geschrieben werden, die einen String darauf prüft, ob es sich um einen int handelt. Das kann man zum einen machen, indem man die einzelnen Ziffern und ein mögliches Plus- oder Minuszeichen und ihre Positionen prüft, was recht mühselig ist. Man kann sich für eine solche Methode aber auch zunutze machen, dass Integer.parseInt( ) eine NumberFormatException wirft, wenn der Inhalt des Strings keinen int darstellt.

Schreiben Sie diese Methode, die einen String als Argument bekommt und „true“ zurückgibt, wenn es sich um einen int handelt, und „false“, wenn dies nicht der Fall ist.

Testen Sie Ihre Methode mit verschiedenen Strings.

Gesucht ist eine Methode, die einen String bekommt. Sie gibt true zurück, wenn er eine ganze Zahl vom Typ int darstellt, sonst false. Der Trick: Integer.parseInt löst bei falschem Text eine Ausnahme aus, eine Fehlermeldung während des Laufs. Fängt man sie ab, weiß man: Das war keine ganze Zahl.

Merke: Eine Ausnahme kann man auch als Antwort nutzen. Klappt der Versuch im try, ist die Antwort ja. Springt Java in den catch, ist sie nein.
  1. Sehen, was parseInt bei falschem Text macht.
  2. Die Methode istEinInteger mit try und catch schreiben.
  3. Mit verschiedenen Strings testen.

Was parseInt bei falschem Text macht

public class Absturz {     public static void main(String[] args) {        int zahl = Integer.parseInt("a123");        System.out.println(zahl);    }}
Exception in thread "main" java.lang.NumberFormatException: For input string: "a123"
	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
	at java.base/java.lang.Integer.parseInt(Integer.java:529)
	at java.base/java.lang.Integer.parseInt(Integer.java:626)
	at Absturz.main(Absturz.java:4)

Integer.parseInt("123") wandelt den Text "123" in die Zahl 123 um. Bei "a123" geht das nicht. Dann löst parseInt eine NumberFormatException aus („falsches Zahlenformat“).

Das kleine Programm hier tut nichts anderes, und niemand fängt die Ausnahme ab. Also bricht es ab und zeigt den Stack-Trace, die Kette der Aufrufe bis zum Fehler. Die letzte Zeile nennt unsere Stelle: Zeile 4 in main. Die Ausgabe in Zeile 5 kommt nie.

Aus Vorlesung 1, Folie 63 („Die Klasse Addition“): Ein Text wie "315" ist keine Zahl; erst Integer.parseInt macht daraus den int 315.
Aus Vorlesung 8, Folie 2 („Ausnahme (Exception)“): Eine nicht behandelte Exception beendet das Programm; der Stack-Trace nennt Methoden, Klassen und Zeilennummern.

Die Methode istEinInteger

    public static boolean istEinInteger(String s) {        try {            Integer.parseInt(s);        } catch (NumberFormatException e) {            return false;        }        return true;    }
Parameter sparseInt(s)weiter in ZeileRückgabe
"123"klappt: 12323true
"a123"NumberFormatException21false

Die Methode versucht im try-Block die Umwandlung. Das Ergebnis von parseInt speichern wir nicht: Uns interessiert nur, ob es klappt.

Löst parseInt die NumberFormatException aus, springt Java in den catch-Block. return false; beendet dort die Methode sofort. Klappt die Umwandlung, wird der catch-Block übersprungen. Dann kommt Zeile 23 und gibt true zurück.

Aus Vorlesung 8, Folie 4 („Fehlerbehandlung (Exception-Handling)“): Tritt im try-Block eine Exception auf, wird nur dieser Block abgebrochen und der passende catch-Block ausgeführt.
Aus Vorlesung 4, Folie 4 („Methoden mit Rückgabe von Werten“): return gibt einen Wert zurück und beendet die Methode an dieser Stelle.
Noch 3 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Das Programm PruefeInteger

Methode und Tests

Abbildung 1Das Programm PruefeInteger

Methode und Tests

public class PruefeInteger {     public static void main(String[] args) {        System.out.println(istEinInteger("123"));        System.out.println(istEinInteger("+5"));        System.out.println(istEinInteger("-123"));        System.out.println(istEinInteger("9.5"));        System.out.println(istEinInteger("0193"));        System.out.println(istEinInteger("a123"));        System.out.println(istEinInteger("123_234_555"));        System.out.println(istEinInteger("2147483648"));         int i = 123_234_555;        System.out.println(i);    }     public static boolean istEinInteger(String s) {        try {            Integer.parseInt(s);        } catch (NumberFormatException e) {            return false;        }        return true;    }}
LegendeDas ganze Programm.