Division durch Null in Java: Ausnahme, Unendlichkeit oder keine Zahl

1. Übersicht

Das Teilen durch Null ist eine Operation, die in der gewöhnlichen Arithmetik keine Bedeutung hat und daher undefiniert ist. Bei der Programmierung ist dies zwar häufig mit einem Fehler verbunden, dies ist jedoch nicht immer der Fall .

In diesem Artikel wird erläutert, was passiert, wenn in einem Java-Programm eine Division durch Null auftritt .

Gemäß der Java-Spezifikation der Divisionsoperation können wir zwei verschiedene Fälle der Division durch Null identifizieren: Ganzzahlen und Gleitkommazahlen.

2. Ganzzahlen

Erstens sind die Dinge für ganze Zahlen ziemlich einfach. Das Teilen einer Ganzzahl durch Null führt zu einer ArithmeticException :

assertThrows(ArithmeticException.class, () -> { int result = 12 / 0; });
assertThrows(ArithmeticException.class, () -> { int result = 0 / 0; });

3. Gleitkommatypen

Wenn jedoch den Umgang mit Gleitkommazahlen , wird eine Ausnahme nicht geworfen werden :

assertDoesNotThrow(() -> { float result = 12f / 0; });

Um solche Fälle zu behandeln, verwendet Java einige spezielle numerische Werte, die die Ergebnisse einer solchen Operation darstellen können: NaN , POSITIVE_INFINITY und NEGATIVE_INFINITY.

3.1. NaN

Beginnen wir mit der Division der Gleitkomma-Nullwerte durch Null :

assertEquals(Float.NaN, 0f / 0); assertEquals(Double.NaN, 0d / 0);

Das Ergebnis in diesen Fällen ist NaN (keine Zahl).

3.2. Unendlichkeit

Als nächstes teilen wir einige Nicht-Null-Werte durch Null :

assertEquals(Float.POSITIVE_INFINITY, 12f / 0); assertEquals(Double.POSITIVE_INFINITY, 12d / 0); assertEquals(Float.NEGATIVE_INFINITY, -12f / 0); assertEquals(Double.NEGATIVE_INFINITY, -12d / 0);

Wie wir sehen können, ist das Ergebnis INFINITY, wobei das Vorzeichen vom Vorzeichen der Operanden abhängt .

Darüber hinaus können wir auch das Konzept der negativen Null verwenden, um zu NEGATIVE_INFINITY zu gelangen :

assertEquals(Float.NEGATIVE_INFINITY, 12f / -0f); assertEquals(Double.NEGATIVE_INFINITY, 12f / -0f);

3.3. Speicherdarstellung

Warum löst die Ganzzahldivision durch Null eine Ausnahme aus, während die Gleitkommadivision durch Null dies nicht tut?

Betrachten wir dies aus der Perspektive der Speicherdarstellung. Für ganze Zahlen gibt es kein Bitmuster, das zum Speichern des Ergebnisses einer solchen Operation verwendet werden kann, während Gleitkommazahlen Werte wie NaN oder INFINITY haben , die in solchen Fällen verwendet werden können.

Betrachten wir nun die binäre Darstellung eines Gleitkommas als S EEEEEEE E FFFFFFF FFFFFFFF FFFFFFFF mit einem Bit (S) für das Vorzeichen, 8 Bits (E) für den Exponenten und dem Rest (F) für die Mantisse.

In jedem der drei Werte NaN , POSITIVE_INFINITY und NEGATIVE_INFINITY werden alle Bits im Exponententeil auf 1 gesetzt.

INFINITY hat alle Mantissenbits auf 0 gesetzt, während NaN eine Mantisse ungleich Null hat:

assertEquals(Float.POSITIVE_INFINITY, Float.intBitsToFloat(0b01111111100000000000000000000000)); assertEquals(Float.NEGATIVE_INFINITY, Float.intBitsToFloat(0b11111111100000000000000000000000)); assertEquals(Float.NaN, Float.intBitsToFloat(0b11111111100000010000000000000000)); assertEquals(Float.NaN, Float.intBitsToFloat(0b11111111100000011000000000100000));

4. Zusammenfassung

Zusammenfassend haben wir in diesem Artikel gesehen, wie die Division durch Null in Java funktioniert.

Werte wie INFINITY und NaN sind für Gleitkommazahlen verfügbar, jedoch nicht für Ganzzahlen . Das Teilen einer Ganzzahl durch Null führt daher zu einer Ausnahme. Für einen Float oder Double erlaubt Java jedoch die Operation.

Der vollständige Code ist auf GitHub verfügbar.