18.1 Behandlung von Ausnahmen

Während der Laufzeit eines Programms können Ausnahmen, sogenannte Exceptions, zu einem Programmabbruch führen, wenn für diese Fälle im Quellcode keine entsprechenden Vorkehrungen (Exception Handling) getroffen sind.

Beispiel: Unbehandelte Ausnahme führt zu Programmabbruch

Die Methode parseDouble(s: String): double wirft beim Versuch den Inhalt des übergebenen Strings in eine Gleitkommazahl umzuwandeln eine Ausnahme (NumberFormatException) und bricht das Programm ab. Der Grund hierfür ist, dass der übergebene String ein Komma enthält, die Methode jedoch ausschließlich Ziffern und gegebenenfalls einen Dezimalpunkt erlaubt.

JAVA
public class TestAusnahme {

    public static void main(String[] args) {
        double d;
        
        d = Double.parseDouble("12,99");
        System.out.println("Der Inhalt des übergebenen Strings wurde in eine Gleitkommazahl umgewandelt.");
    }

}
Abb. 18-1: Ausnahme beim Versuch den Inhalt eines Strings in eine Gleitkommazahl umzuwandeln.
Konsole
Exception in thread "main" java.lang.NumberFormatException:
For input string: "12,99"
Abb. 18-2: Unbehandelte Ausnahme führt zu Programmabbruch
Kann eine Anweisung gegebenenfalls eine Ausnahme (engl. Exception) hervorrufen, müssen für diesen Fall im Quellcode entsprechende Vorkehrungen (engl. Exception Handling) getroffen werden.

Anweisungen, bei deren Abarbeitung gegebenenfalls Ausnahmen (Exceptions) auftreten können, werden in einen try-Block eingeschlossen. Tritt während der Laufzeit beim Versuch eine dieser Anweisungen abzuarbeiten eine Ausnahme auf, wird diese abgefangen und durch die im darauffolgenden catch-Block festgelegten Anweisungen behandelt (Exception Handling).

Über die Art der Ausnahme informiert ein als Parameter übergebenes Objekt der Klasse Exception bzw. einer davon abgeleiteten Klasse. Dieses kann bei Bedarf ausgewertet werden.

JAVA
try {
    /* Anweisungen, bei deren Abarbeitung
       Ausnahmen auftreten können. */
}
catch(Exception ex) {
    /* Anweisungen,die eine aufgetretene
       Ausnahme (Exception) behandeln. */
}
Abb. 18-3: Behandlung von Ausnahmen mit einem try-catch-Block
Merke: Behandlung von Ausnahmen
Beispiel: Behandlung von Ausnahmen mit einem try-catch-Block

Die Methode parseDouble(s: String): double wirft beim Versuch den Inhalt des übergebenen Strings in eine Gleitkommazahl umzuwandeln eine Ausnahme (NumberFormatException) und bricht das Programm ab. Der Grund hierfür ist, dass der übergebene String ein Komma enthält, die Methode jedoch ausschließlich Ziffern und gegebenenfalls einen Dezimalpunkt erlaubt.

JAVA
public class TestAusnahme {

    public static void main(String[] args) {
        double d;
        
        try {
            d = Double.parseDouble("12,99");
            System.out.println("Der Inhalt des übergebenen Strings wurde in eine Gleitkommazahl umgewandelt.");
        }
        catch(NumberFormatException nfEx) {
            System.out.println("Der übergebene String enthält nicht ausschließlich Ziffern bzw. einen Dezimalpunkt.");
        }
    }

}
Abb. 18-3: Ausnahmebehandlung beim Versuch den Inhalt eines Strings in eine Gleitkommazahl umzuwandeln.
Konsole
Der übergebene String enthält nicht ausschließlich Ziffern bzw.
einen Dezimalpunkt.
Abb. 18-4: Ausgabe einer Meldung auf der Konsole, die über die Ursache der Ausnahme informiert.

Ausgabe einer Meldung in einem Dialogfenster

Die Klasse JOptionPane stellt verschiedene statische Methoden bereit, mit deren Hilfe sich einfache Standarddialoge implementieren lassen.

img/Abb_18_5_UML_JOptionPane.svg
javax.swing::JOptionPane
public static showMessageDialog(parentComponent: Component, message: Object)
Ein Dialogfenster wird über der als parentComponent angegebenen grafischen Komponente zentriert und zeigt die als message übergebene Meldung an.
Abb. 18-5: Die Klasse JOptionPane (UML)
Beispiel
img/Abb_18_6_Dialogfenster.jpg
Abb. 18-6: Ausgabe einer Meldung in einem Dialogfenster
JAVA
import javax.swing.JOptionPane;

public class TestAusnahme {

    public static void main(String[] args) {
        double d;
        
        try {
            d = Double.parseDouble("12,99");
            JOptionPane.showMessageDialog(null, "Der Inhalt des übergebenen Strings wurde in eine Gleitkommazahl umgewandelt.");
        }
        catch(NumberFormatException nfEx) {
            JOptionPane.showMessageDialog(null, "Der übergebene String enthält nicht ausschließlich Ziffern bzw. einen Dezimalpunkt.");
        }
    }

}
Abb. 18-7: Ausgabe einer Meldung in einem Dialogfenster (Quellcode)
Aufgabe

Aufgabe 18-1: Body Mass Index (GUI mit Ausnahmebehandlung)

Sichern Sie die in Aufgabe 17-1 erstellte GUI für die Anwendung „Body Mass Index (GUI)“ so ab, dass durch Benutzereingaben ausgelöste Exceptions abgefangen werden. Der Benutzer soll in diesen Fällen eine verständliche Meldung in einem Dialogfenster erhalten, aus der hervorgeht, was er ändern muss.

Lösung
Lösung
JAVA
package gui;

import javax.swing.JOptionPane;

...

    private void berechnen() {
        BodyMassIndex bodyMassIndex = new BodyMassIndex();
        double gewicht;
        double groesse;
        double bmi;

        try {
            gewicht = Double.parseDouble(tfGewicht.getText().replace(",", "."));
            try {
                groesse = Double.parseDouble(tfGroesse.getText().replace(",", "."));
                
                bodyMassIndex.setGewicht(gewicht);
                bodyMassIndex.setGroesse(groesse);
                bmi = bodyMassIndex.berechneBMI();
                bmi = Werkzeug.runden(bmi, 2);
                
                tfBMI.setText(Double.toString(bmi).replace(".", ","));
                tfAuswertung.setText(bodyMassIndex.ermittleAuswertungBMI());
            }
            catch(NumberFormatException nfEx2) {
                JOptionPane.showMessageDialog(this, "Bitte geben Sie als Größe eine Dezimalzahl ein.");
            }
        }
        catch(NumberFormatException nfEx) {
            JOptionPane.showMessageDialog(this, "Bitte geben Sie als Gewicht eine Dezimalzahl ein.");
        }
    }
}
Abb. 18-9: Die Methode berechnen() der GUI-Klasse FensterBMI inklusive Ausnahmebehandlung (Quellcode)
Aufgabe

Aufgabe 18-2: Noten II (GUI mit Ausnahmebehandlung)

Sichern Sie die in Aufgabe 17-2 erstellte GUI für die Anwendung „Noten II (GUI)“ so ab, dass durch Benutzereingaben ausgelöste Exceptions abgefangen werden. Der Benutzer soll in diesen Fällen eine verständliche Meldung in einem Dialogfenster erhalten, aus der hervorgeht, was er ändern muss.

Lösung
Lösung
JAVA
package gui;

import javax.swing.JOptionPane;

...

    private void berechnen() {
        Noten noten = new Noten();
        double notenschnitt;

        try {
            noten.setNoteKlArb1( Integer.parseInt(tfNoteKlArb1.getText()) );
            try {
                noten.setNoteKlArb2( Integer.parseInt(tfNoteKlArb2.getText()) );
                try {
                    noten.setNoteMuendlich( Integer.parseInt(tfNoteMuendlich.getText()) );
                    
                    notenschnitt = noten.berechneNotendurchschnitt();
                    tfSchnitt.setText(Double.toString(notenschnitt).replace(".", ","));
                    tfZeugnisnote.setText(noten.ermittleZeugnisnote());
                }
                catch(NumberFormatException nfEx3) {
                    JOptionPane.showMessageDialog(this, "Bitte geben Sie als mündliche Note eine Dezimalzahl ein.");
                }
            }
            catch(NumberFormatException nfEx2) {
                JOptionPane.showMessageDialog(this, "Bitte geben Sie als Note für die 2. Klassenarbeit eine Dezimalzahl ein.");
            }
        }
        catch(NumberFormatException nfEx) {
            JOptionPane.showMessageDialog(this, "Bitte geben Sie als Note für die 1. Klassenarbeit eine Ganzzahl ein.");
        }
    }
}
Abb. 18-10: Die Methode berechnen() der GUI-Klasse FensterNoten inklusive Ausnahmebehandlung (Quellcode)