Strings und Zahlen (1)

Als String gesprungen und als Integer gelandet

Häufig verhalten sich Benutzer nicht so, wie es der Programmierer erwartet. Wenn aber dann das Programm ohne eine sinnvolle Fehlermeldung einfach abbricht, sind sie zu Recht verärgert. Bevor wir uns einigen Problemen der Zahlenverarbeitung zuwenden, lernen wir hier eine Methode kennen, um unzulässige Benutzereingaben abzufangen.

Starten Sie das folgende Programm. Geben Sie Unsinn ein (z.B. "zwölf" oder "11,5") und versuche die Fehlermeldung zu verstehen, die das Programm beim Abbruch erzeugt.


import java.util.*;
public class Eingabetest {
  public static void main(String[] args) {
    Scanner Eingabe = new Scanner(System.in);
    int alter=0;
    System.out.println("Altersverifikation\n");
    System.out.print("Gib bitte dein Alter ein: ");
    alter = Eingabe.nextInt();                                   // Hier tritt der Fehler auf!
    if (alter < 14) {
      System.out.println("Mit "+alter+" bist du noch ein Kind.");
    } else if (alter<18) {
        System.out.println("Mit "+alter+" bist du beschränkt geschäftsfähig.");
      } else {
        System.out.println("Mit "+alter+" bist du erwachsen.");
      }
  }
}


Sie verstehen nur Bahnhof? So geht es auch Ihren Benutzern, wenn Sie sie mit den Fehlermeldungen von Java allein lassen.
Ersetzen Sie die oben mit dem Kommentar // markierte Zeile durch die folgenden sieben Zeilen:


    String antwort = Eingabe.next();
    try {
      alter = Integer.parseInt(antwort);
    } catch (Exception e) {
      System.out.println("Falsche Eingabe. Gib bitte eine ganze Zahl ein.");
      return;
    }


Wenn Sie erneut versuchen, das Programm zum Absturz zu bringen, reagiert es einer lesbaren Fehlermeldung. Was ist passiert?

Ausnahmebehandlung

Schuld am Absturz des Programms war die der Umstand, dass Strings wie "fünfzehn" oder "12 1/2" von Java nicht in eine Integerzahl umgewandelt werden können. In der ursprünglichen Fassung erzeugt die Anweisung  alter = Eingabe.nextInt(); einen Laufzeitfehler und Java gibt auf.

In der verbesserten Fassung wird die Antwort des Benutzers zunächst in einen String eingelesen. Dabei drohen keine Komplikationen. Dieser String wird mit der Methode Integer.parseInt() erst nachträglich in einen String verwandelt.

Entscheidend aber ist, dass diese Funktion sozusagen in einem geschützten Raum ausgeführt wird. Die Kontrollstruktur try {...} catch (Exception e) {...} versucht sozusagen unverbindlich, die Befehle des try-Anweisungsblocks auszuführen. Tritt dabei eine Exception (Ausnahmebedingung) auf, so fängt sie diese ab und führt die Anweisungen nach dem catch-Anweisungsblock aus, gibt in unserem Fall also die lesbare Fehlermeldung aus. Danach kehrt das Programm mit return zur aufrufenden Ebene (in unserem Fall der Kommandoebene) zurück.

Ein fortgeschrittener Programmierer kann durch Auslesen der Variable e Genaueres über den aufgetretenen Fehler erfahren. Das gibt ihm die Möglichkeit, verschiedenartige Ausnahmezustände unterschiedlich zu behandeln. Das führt hier zu weit.

Aufgaben:

  1. Bauen Sie um die try-catch-Kontrollstruktur herum eine while-Schleife, die die Frage so lange wiederholt, bis die Antwort brauchbar ist. Die Anweisung return; im catch-Anweisungsblock muss in diesem Fall entfallen.