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.
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.");
}
}
For input string: "12,99"
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.
/* Anweisungen, bei deren Abarbeitung
Ausnahmen auftreten können. */
}
catch(Exception ex) {
/* Anweisungen,die eine aufgetretene
Ausnahme (Exception) behandeln. */
}
try-catch-BlockBeispiel: 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)