salida - La división de Java por cero no lanza una excepción aritmética, ¿por qué?
propagacion de excepciones en java (7)
¿Por qué no puedes comprobarlo tú mismo y lanzar una excepción si eso es lo que quieres?
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!");
}
¿Por qué este código no lanza una ArithmeticException
? Echar un vistazo:
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!");
}
}
}
¡No tengo idea!
0.0 es un doble literal y esto no se considera como cero absoluto! ¡No hay excepción porque se considera que la variable doble es lo suficientemente grande como para contener los valores que representan casi el infinito!
Eso es porque estás tratando con números de punto flotante. La división por cero devuelve Infinity
, que es similar a NaN
(no es un número).
Si desea evitar esto, debe probar la tab[i]
antes de usarla. Entonces puedes lanzar tu propia excepción, si realmente la necesitas.
Hay un truco. Las excepciones aritméticas ocurren cuando estás jugando con integrales y solo durante / o% de operación.
si hay algún número de punto flotante en la operación aritmética, internamente todas las integrales se convertirán en punto flotante. Esto puede ayudarte a recordar cosas fácilmente.
Java no lanzará una excepción si se divide por cero flotante. Detectará un error en tiempo de ejecución solo si divide por cero entero y no por cero.
Si divides por 0.0, el resultado será INFINITY.
IEEE 754 define 1.0 / 0.0
como Infinito y -1.0 / 0.0
como Infinito y 0.0 / 0.0
como NaN.
Por cierto, el punto flotante también tiene -0.0
y, por lo tanto, 1.0/ -0.0
es -Infinity
.
La aritmética de enteros no tiene ninguno de estos valores y, en su lugar, lanza una excepción.
Para verificar todos los valores posibles, incluido NaN, 0.0, -0.0 que podría producir un número no finito, puede hacer lo siguiente.
if (Math.abs(tab[i] = 1 / tab[i]) < Double.POSITIVE_INFINITY)
throw new ArithmeticException("Not finite");
Cuando se divide por cero
Si divide el doble por 0, JVM mostrará Infinito .
public static void main(String [] args){ double a=10.00; System.out.println(a/0); }
Consola:
Infinity
Si divide int entre 0, entonces JVM lanzará una excepción aritmética .
public static void main(String [] args){ int a=10; System.out.println(a/0); }
Consola:
Exception in thread "main" java.lang.ArithmeticException: / by zero