Home > Informatik > Begriffe und Konzepte > ArithmeticException

ArithmeticException

Allgemeines

Eine ArithmeticException tritt bei ganzzahliger Division durch 0 auf; andere Anwendungsfälle für diese Exception sind sehr selten. Betrachten wir einmal die folgende for-Schleife:

for (int i = 10; i > -10; i--)
   x = y / i;

Sobald die Laufvariable i bei ihrem Abstieg den Wert 0 erreicht hat, versucht das Programm, durch 0 zu dividieren. Dabei löst die JVM eine ArithmeticException aus.

Die folgende Variante löst ebenfalls eine ArithmeticException aus, diesmal jedoch ausdrücklich mit throw:

for (int i = 10; i > -10; i--)
{
   if (i == 0)
      throw new ArithmeticException("Division durch 0!");
   x = y / i;
}

Hier wird die Exception also nicht erst durch die Division verursacht, sondern bereits vorher absichtlich ausgelöst.

Das gilt übrigens nur für die ganzzahlige Division, also etwa bei int oder long. Bei double oder float führt eine Division durch 0 nicht zu einer ArithmeticException, sondern zu speziellen Werten wie Infinity oder NaN.

Vergleichen wir einmal an einem einfachen Beispiel, welche Vorteile uns das Exception-Handling bringt.

Bisher
public double quotient(double zaehler, double nenner)
{
   if (nenner == 0)
   {
      System.out.println("Division durch 0!");
      return 0;
   }
   else
      return zaehler / nenner;
}

Der Zähler wird hier als Parameter übergeben und kann durchaus auch einmal den Wert 0 haben; die Methode quotient() kann dies nicht vorhersehen. In diesem Fall wird hier eine Fehlermeldung in der Konsole ausgegeben und die Methode dann mit return 0 verlassen. Irgendein double-Wert muss auf jeden Fall mit return zurückgegeben werden, da die Signatur der Methode dies ausdrücklich verlangt.

Jetzt
public double quotient(double zaehler, double nenner)
{
   if (nenner == 0)
      throw new ArithmeticException("Division durch 0!");
   return zaehler / nenner;
}

Wenn der Nenner den Wert 0 haben sollte, wird eine ArithmeticException geworfen, um die sich dann die aufrufende Methode kümmern muss - entweder durch Weiterreichen oder durch eine eigene Behandlung mit try-catch.

Übrigens ist der Ausdruck nenner == 0 nicht optimal für double-Werte, aber das ist ein anderes Thema und soll hier nicht vertieft werden.

Seltene Fälle von ArithmeticException

In den allermeisten Fällen tritt eine ArithmeticException auf, wenn bei einer ganzzahligen Division durch 0 geteilt wird. Das ist der typische und mit Abstand häufigste Fall.

Es gibt aber auch seltenere Situationen, in denen eine ArithmeticException geworfen werden kann, nämlich dann, wenn bei einer ganzzahligen Rechnung ein Überlauf ausdrücklich erkannt werden soll. Das betrifft jedoch nicht die normalen Rechenoperatoren wie +, * oder ++, denn diese lösen bei int-Werten in Java normalerweise keine Exception aus. Stattdessen entsteht einfach ein falscher, "umgesprungener" Wert.

Eine ArithmeticException wegen Überlaufs erhält man nur dann, wenn man spezielle Methoden der Klasse Math verwendet, zum Beispiel Math.incrementExact() oder Math.addExact(). Diese Methoden prüfen, ob das Ergebnis noch im zulässigen Wertebereich des Datentyps int liegt.

public class OverflowDemo
{
    public static void main(String[] args)
    {
        int x = Integer.MAX_VALUE;
        x = Math.incrementExact(x);

        System.out.println(x);
    }
}

In diesem Beispiel hat x bereits den größtmöglichen int-Wert. Eine weitere Erhöhung ist daher nicht mehr möglich. Die Methode Math.incrementExact() erkennt diesen Überlauf und wirft eine ArithmeticException.