このコードがArithmeticException
をスローしないのはなぜですか?見てみましょう:
public class NewClass {
public static void main(String[] args) {
// TODO code application logic here
double tab[] = {1.2, 3.4, 0.0, 5.6};
try {
for (int i = 0; i < tab.length; i++) {
tab[i] = 1.0 / tab[i];
}
} catch (ArithmeticException ae) {
System.out.println("ArithmeticException occured!");
}
}
}
何も思いつきません!
なぜ自分でそれを確認し、それがあなたが望むのであれば例外を投げることができないのですか?.
try {
for (int i = 0; i < tab.length; i++) {
tab[i] = 1.0 / tab[i];
if (tab[i] == Double.POSITIVE_INFINITY ||
tab[i] == Double.NEGATIVE_INFINITY)
throw new ArithmeticException();
}
} catch (ArithmeticException ae) {
System.out.println("ArithmeticException occured!");
}
IEEE 754 定義1.0 / 0.0
は無限大として、-1.0 / 0.0
as -Infinityおよび0.0 / 0.0
NaNとして。
BTW浮動小数点も-0.0
など 1.0/ -0.0
は-Infinity
。
整数演算にはこれらの値はなく、代わりに例外がスローされます。
NaN、0.0、-0.0を含むすべての可能な値をチェックして、有限でない数値を生成する可能性がある場合は、次を実行できます。
if (Math.abs(tab[i] = 1 / tab[i]) < Double.POSITIVE_INFINITY)
throw new ArithmeticException("Not finite");
これは、浮動小数点数を扱っているためです。ゼロ除算はInfinity
を返します。これはNaN
(数字ではない)と似ています。
これを防ぐには、使用する前にtab[i]
をテストする必要があります。その後、本当に必要な場合は、独自の例外をスローできます。
0.0は二重リテラルであり、これは絶対ゼロとは見なされません!ほぼ無限大を表す値を保持するのに十分な大きさのdouble変数と見なされるため、例外はありません!
Float 0で除算しても、Javaは例外をスローしません。 integer zero double doubleではなく除算した場合にのみ、実行時エラーを検出します。
0.0で除算すると、結果は無限になります。
トリックがあります。算術例外は、整数で遊んでいるとき、および/または%演算中にのみ発生します。
算術演算に浮動小数点数がある場合、内部的にすべての整数が浮動小数点に変換されます。これにより、物事を簡単に覚えることができます。
ゼロで除算した場合
Doubleを0で除算すると、JVMはInfinityを表示します。
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
コンソール:Infinity
Intを0で除算すると、JVMは算術例外をスローします。
public static void main(String [] args){
int a=10;
System.out.println(a/0);
}
コンソール: Exception in thread "main" Java.lang.ArithmeticException: / by zero