10.2 Java-Ausnahmen deklarieren und werfen

Werfen von Ausnahmen

Java erlaubt nicht nur die vom Laufzeitsystem erzeugten Ausnahmen zu behandeln. Java erlaubt es auch selbst Ausnahmen zur Erzeugen. Dies geschieht durch das Erzeugen einer Instanz einer Klasse die aus der Klasse Throwable abgeleitet ist. Im folgenden Beispiel geschieht dies, in dem vor einer Division auf eine mögliche Division durch Null geprüft wird :

package s1.block10;
import java.lang.IllegalArgumentException;

public class Grundrechenarten1 {
   public static int division(int a, int b) {
      IllegalArgumentException ex;
      if (b==0) {
         ex = new IllegalArgumentException("Division durch 0!");
         throw ex;
      }
    return a/b;
   }
 
   public static void main(String[] args) {
      int c = division(3,0);
   }
}

Das Werfen einer eigenen Ausnahme erfolgt in zwei Schritten:

  • Dem Erzeugen einer Instanz der Ausnahmeklasse. Hier kann ein Text mit Informationen im Konstruktor mitgegeben werden.
  • Dem Werfen der Ausnahme mit dem Schlüsselwort throw und der Angabe eines Ausnahmeobjekts

Beim Ausführen des oben gezeigten Programms wird die folgende Meldung ausgegeben:

Exception in thread "main" java.lang.IllegalArgumentException: Division durch 0!
        at s1.block10.Grundrechenarten1.division(Grundrechenarten.java:9)
        at s1.block10.Grundrechenarten1.main(Grundrechenarten.java:16)

Da das Ausnahmeobjekt in der Regel nicht weiter oder wieder verwendet wird, kann man das Erzeugen des Objekts direkt mit dem Werfen der Ausnahme verbinden:

throw new IllegalArgumentException("Division durch 0!");

Selbstimplementierte Ausnahmeklassen

Java erlaubt auch das Implementieren eigener Ausnahmeklasse. Man kann zum Beispiel die Klasse IllegalArgumentException zu einer eigenen Klasse ableiten:

package s1.block10;

public class DivisionException extends IllegalArgumentException {
   int dividend;
   int divisor;

   public DivisionException(int a, int b) {
         super ("Versuch von Division " + a + "/" + b);
      dividend =a;
      divisor = b;
   }
}

Das Hauptprogramm muss entsprechend angepasst werden:

package s1.block10;
import java.lang.IllegalArgumentException;

public class Grundrechenarten2 {
   public static int division2(int a, int b) {
      DivisionException ex;
      if (b==0) {
         ex = new DivisionException(a,b);
         throw ex;
      }
      return a/b;
   }

   public static void main(String[] args) {
      int c = division2(3,0);
   }
}

Es wird dann eine angepasste Fehlermeldung geworfen:

Exception in thread "main" Kurs2.Exception.DivisionException: Versuch von Division 3/0
        at s1.block10.Grundrechenarten2.division2(Grundrechenarten.java:18)
        at s1.block10.Grundrechenarten2.main(Grundrechenarten.java:25)
Java Result: 1