22.3 Ausnahmebehandlungen macht ein Programm sicherer
 
Falsche Eingabe Gibt man in unserem Rechner in den Eingabefeldern für a oder b z.B. Fließkommazahlen, also a = 2.3 und b = 4.0 ein und lässt sich daraus kein ggT(a,b) bestimmen, denn zur Berechnung eines ggT werden ganze Zahlen erwartet. Fließkommazahlen sind aber in den Eingabefelder zugelassen, wenn man die Lösung einer quadratischen Gleichung sucht. Dann allerdings machen Eingaben von Buchstaben oder ganzen Wörtern keinen Sinn, sie führen sogar zum Absturz des Programms. Wie kann man nun ein Programm gegen falsche Eingaben schützen? Und wo, also in welcher Klasse ist dieser Schutz zu implementieren ? Die zweite Frage lässt sich schnell beantworten. Natürlich bietet sich wieder unser neuer Button an, der 'weiß' ja welche Aufgabe zu lösen ist und ist ihm auch 'bekannt', mit welchen Eingaben er etwas anfangen kann und welche unsinnig sind und damit zu einem Absturz führen würden.
 
try -catch Kommen wir zur Beantwortung der ersten Frage. Java bietet zum Abfangen von sog. Ausnahmen die try - catch Routine an. Sie funktioniert so: Schreibe alles, was eine Methode eigentlich tun soll in einen try-Block:

public <methodenNamen>(<Parameterliste>) {
   // z.B. Methoden-Variabel
   try {
     //hier kommt alles rein, was die Methode ausmacht
     //und möglicherweise zu Fehlern führt
   }
   catch(<Spezifikation der Ausnahme){
     //hier kommt alles rein, was getan werden soll, wenn
     //es im try-Block zu einer Ausnahme gekommen ist. 
   }
}
 

In den Block von catch kommen alle Dinge, die getan werden sollen, wenn es zu einer Ausnahme infolge einer syntaktisch falschen Eingabe kommt.
 

die neue Methode actionPer- formed(...)
public void actionPerformed(ActionEvent e){
 try{
  double a = Double.parseDouble(rechner.eingabeFeldA.getText());
  double b = Double.parseDouble(rechner.eingabeFeldB.getText());
  double c = Double.parseDouble(rechner.eingabeFeldC.getText());
  rechner.ausgabeFeld.setText(Mathematik.loeseQuadGl(a,b,c));
 }
 catch(NumberFormatException nfe){
  rechner.ausgabeFeld.setText("In allen Feldern Fließkommazahlen 
                               oder ganze Zahlen eingegeben!");
  rechner.eingabeFeldA.setText("0");
  rechner.eingabeFeldB.setText("0");
  rechner.eingabeFeldC.setText("0");
 }
}
  Steht tatsächlich in einem der Eingabefelder ein Wert, der nicht zu einer Fließkommazahl vom Typ double 'verwandelt' (wir sagen später dazu gecastet) werden kann, wird beim Versuch die Methode Double.parseDouble(...) auszuführen, eine Ausnahme in Form eines Objektes der Klasse NumberFormatException geworfen, die in der catch-Klausel aufgefangen und bearbeitet wird. Unser so geworfenes Ausnahmeobjekt nennen wir nfe. Mit der Methode getMessage() könnte man die Fehlermeldung anzeigen lassen. Dazu ersetze man
rechner.ausgabeFeld.setText("In allen Feldern Fließkommazahlen 
                               oder ganze Zahlen eingegeben!");

durch

rechner.ausgabeFeld.setText(nfe.getMessage());

Probieren Sie es aus.

 

Übungen Erstellen Sie weitere eigene JButtons, die ihre eigene Methode actionPerformed(ActionEvent e) implementieren und in denen Eingaben mit falschem Format abgefangen werden.
  • JButtonGl (Lösen von linearen Gleigungen)
  • JButtonGGT, hier ist zusätzlich darauf zu achten, dass das Format der Eingabe zwar passen kann, jedoch semantisch Unsinn passiert, wenn etwa eine der Eingaben eine Zahl kleiner oder gleich 0 ist.
  • JButtonKGV, hier gilt das gleiche wie beim JButtonGGT
  • JButtonFAK, hier muss man darauf achten, dass die Eingabe keine ganze Zahl größer 20 sein darf. Warum? Probieren Sie es aus.
  • JButtonFIB, hier ist die Obergrenze bei der Eingabe 71.  Probieren Sie es. Geben Sie Zahlen wie 72 oder 73 ein und vergleichen Sie das Ergebnis mit denen, die ein CAS-System wie Maple oder Mathematica liefern.

Hinweis:
Wird der Inhalt dieses Kapitel in einem Unterricht erarbeitet, bietet sich an dieser Stelle an, die genannten Aufgaben von unterschiedlichen Gruppen oder Personen bearbeitet zu lassen. Besser kann man kaum demonstriert werden, wie OOP das Modularisieren eines Problems unterstützt.
 

Lösungen JButtonQuadGl.java, JButtonGl.java, JButtonGGT.java, JButtonKGV.java, JButtonFAK.java, JButtonFIB.java.
  RechnerGUI.java, Mathematik.java
 
 

 

zur Startseite www.pohlig.de  (C) MPohlig 2004