Warum verursacht die Verwendung von Integer-Variablen eine Ausnahme?

7

Ich habe die folgenden zwei Codes gefunden. Warum wirft es keine Ausnahme für Fließkomma, wo es in anderen Fällen eine Laufzeitausnahme auslöst.

%Vor%

AUSGABE: b = Unendlich .

Wenn ich mit int-Werten versuche, wird eine Laufzeitausnahme ausgelöst. Warum ist es so?

    
giri 01.08.2010, 04:32
quelle

4 Antworten

12

Die kurze Antwort

Integrale Typen ( JLS 4.2.1 ) sind kategorisch anders als Gleitkommatypen ( JLS 4.2.3 ) . Es kann Ähnlichkeiten in Verhalten und Operationen geben, aber es gibt auch charakteristische Unterscheidungsmerkmale, so dass eine Verwechslung der beiden zu vielen Fallstricken führen kann.

Der Unterschied im Verhalten bei der Division durch Null ist nur einer dieser Unterschiede. Daher lautet die kurze Antwort, dass Java sich so verhält, weil die Sprache dies sagt.

Auf Integral- und Fließkommawerten

Die Werte der ganzzahligen Typen sind ganze Zahlen in den folgenden Bereichen:

  • byte : von -128 bis 127 einschließlich, d. h. [-2 7 , 2 7 -1]
  • short : von -32768 bis 32767 einschließlich, d. h. [-2 15 , 2 15 -1]
  • int : von -2147483648 bis 2147483647 einschließlich, d. h. [-2 31 , 2 31 -1]
  • long : von -9223372036854775808 bis 9223372036854775807 einschließlich, d. h. [-2 63 , 2 63 -1]
  • char , von '\u0000' bis '\uffff' inklusive, also von 0 bis 65535 , also [0, 2 16 -1]

Die Fließkommatypen sind float und double , die konzeptuell dem 64-Bit-Format mit einfacher Genauigkeit und dem 64-Bit-Format mit doppelter Genauigkeit zugeordnet sind IEEE 754 Werte und Operationen.

Ihre Werte sind wie folgt geordnet, vom kleinsten zum größten:

  • negative Unendlichkeit,
  • negative endliche Nicht-Null-Werte,
  • positive und negative Null (d. h. 0.0 == -0.0 ),
  • positive endliche Werte ungleich Null und
  • positive Unendlichkeit.

Zusätzlich gibt es spezielle Not-a-Number ( NaN ) Werte, die ungeordnet sind. Dies bedeutet, dass wenn (oder beide!) Der Operand NaN ist:

  • numerische Vergleichsoperatoren < , <= , > und >= return false
  • numerischer Gleichheitsoperator == gibt false zurück
  • numerischer Ungleichheitsoperator != gibt true zurück

Insbesondere x != x ist true wenn und nur wenn x ist NaN .

Für z.B. double , die Unendlichkeiten und NaN können wie folgt bezeichnet werden:

Die Situation ist analog zu float und Float .

Ein, wenn Ausnahmen ausgelöst werden können

Numerische Operationen können in diesen Fällen nur Exception auslösen:

  1. NullPointerException , wenn die Unboxing-Konvertierung von null reference erforderlich ist
  2. ArithmeticException , wenn die rechte Seite für ganze Divide / Rest-Operationen
  3. gleich null ist
  4. OutOfMemoryError , wenn eine Box-Konvertierung erforderlich ist und nicht genügend Speicher verfügbar ist

Sie sind nach Wichtigkeit geordnet, um eine häufige Quelle für Fallstricke zu sein. Allgemein gesprochen:

  • Seien Sie besonders vorsichtig mit Boxtypen, da sie wie alle anderen Referenztypen null sein können.
  • Seien Sie besonders vorsichtig mit der rechten Seite einer Ganzzahldivision / Restoperationen
  • Arithmetischer Überlauf / Unterlauf DOES NOT bewirkt, dass eine Ausnahme ausgelöst wird
  • Genauigkeitsverlust DOES NICHT verursacht das Auslösen einer Ausnahme
  • Eine mathematisch unbestimmte Fließkommaoperation DOES NICHT bewirkt, dass eine Ausnahme ausgelöst wird

Bei Division durch Null

Für ganze Zahl Operation:

  • Divisions- und Restoperationen werfen ArithmeticException , wenn die rechte Seite Null ist

Für Fließkomma Operation:

  • Wenn der linke Operand NaN oder 0 ist, lautet das Ergebnis NaN .
  • Wenn die Operation division ist, läuft sie über und das Ergebnis ist eine vorzeichenbehaftete Unendlichkeit
  • Wenn die Operation Rest ist, lautet das Ergebnis NaN

Die allgemeine Regel für alle Gleitkommaoperationen lautet wie folgt:

  • Eine Operation, die überläuft, erzeugt eine vorzeichenbehaftete Unendlichkeit.
  • Eine Operation, die unterläuft, erzeugt einen denormalisierten Wert oder eine vorzeichenbehaftete Null.
  • Eine Operation, die kein mathematisch eindeutiges Ergebnis hat, erzeugt NaN .
  • Alle numerischen Operationen mit NaN als Operand ergeben NaN als Ergebnis.

Anhang

Es gibt immer noch viele Probleme, die nicht durch diese lange Antwort abgedeckt sind, aber die Leser werden ermutigt, verwandte Fragen und referenzierte Materialien zu durchsuchen.

Verwandte Fragen

polygenelubricants 01.08.2010 09:52
quelle
11

Da Floats tatsächlich haben eine Repräsentation für die "Zahl", die Sie zu berechnen versuchen. So benutzt es das. Eine ganze Zahl hat keine solche Darstellung.

Java (meistens) folgt IEEE754 für seine Gleitkommaunterstützung, siehe hier für weitere Details.

    
paxdiablo 01.08.2010 04:35
quelle
2

Dies liegt daran, dass Integer-Arithmetik das Ergebnis immer umschließt, mit Ausnahme von (Division / Rest by Zero).
Im Falle von float, wenn es einen Überlauf oder Unterlauf gibt, geht die Verpackung auf 0, unendlich oder NaN.
Während des Überlaufs gibt es unendlich und während des Unterlaufs gibt es 0.
Auch hier gibt es positive & amp; negativer Überlauf / Unterlauf.
Probieren Sie:

%Vor%

Dies ergibt einen negativen Überlauf

Ausgabe

  

b = -Unendlichkeit

In gleicher Weise ergibt ein positiver Unterlauf einen Wert von 0 und einen negativen Unterlauf von -0 Bestimmte Operationen können auch dazu führen, dass ein NaN (Not a Number) durch float / double zurückgegeben wird.
Für zB:

%Vor%

Ausgabe von

  

b = NaN

    
aNish 01.08.2010 08:09
quelle
1

Es ist ein Programmier- und Mathematikstandard für die Darstellung von / durch Nullwerte. float unterstützt die Darstellung solcher Werte in JAVA. int (integer) -Datentyp hat keine Möglichkeit, in JAVA gleich darzustellen.

Überprüfen Sie:

Ссылка

Ссылка

    
YoK 01.08.2010 08:46
quelle