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.
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.
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.");
}
}
}
einen Dezimalpunkt.
Ausgabe einer Meldung in einem Dialogfenster
Die Klasse JOptionPane
stellt verschiedene statische Methoden bereit, mit deren Hilfe sich einfache Standarddialoge implementieren lassen.
public static showMessageDialog(parentComponent: Component, message: Object)
parentComponent
angegebenen grafischen Komponente zentriert und zeigt die als message
übergebene Meldung an.
JOptionPane
(UML)Beispiel
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.");
}
}
}
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ösungLösung
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.");
}
}
}
berechnen()
der GUI-Klasse FensterBMI
inklusive Ausnahmebehandlung (Quellcode)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ösungLösung
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.");
}
}
}
berechnen()
der GUI-Klasse FensterNoten
inklusive Ausnahmebehandlung (Quellcode)