saber por otro operador numeros numero entera divisores divisibles divisible como algoritmo java divide-by-zero

otro - ¿Cómo maneja Java la división por cero?



operador % en java (4)

¿Simplemente verifica si el divisor es diferente de cero cada vez que se realiza una división (incluso en el código editado por JIT)?

Me refiero a cómo VM se las arregla para lanzar una excepción sin ser asesinado previamente por el sistema operativo.


Java maneja la situación como cualquier otro lenguaje. Un error de división por cero genera una excepción de procesador que activa una interrupción. La interrupción es "leída" por el sistema operativo y se reenvía al programa si se registra un controlador. Como Java registra un controlador, recibe el error y luego lo traduce en una ArithmeticException que viaja hacia la pila.


La JVM atrapa la División por Cero así con C:

#include <stdio.h> #include <signal.h> #include <stdlib.h> void fpe_handler(int signum) { printf("signal is %d", signum); printf("JVM throws an ArithmeticException here.../n"); exit (1); } int main() { int a = 5; int b = 0; signal(SIGFPE, fpe_handler); printf("%d/n", a / b); return 0; }

Compila y ejecuta imprime esto:

el@apollo:~$ gcc -o catch_sigfpe myc.c el@apollo:~$ ./catch_sigfpe signal is 8 JVM throws an ArithmeticException here... el@apollo:~$

El sistema operativo genera sincrónicamente una excepción SIGFPE, el programa C lo atrapa, y luego Java lo construye y le envía la ArithmeticException y se limpia después de sí mismo para detener el programa Java.

Vea más sobre la señal devuelta aquí: http://publib.boulder.ibm.com/infocenter/javasdk/v6r0/index.jsp?topic=%2Fcom.ibm.java.doc.user.aix64.60%2Fuser%2Fsighand.html


OS envía señal al proceso. El controlador predeterminado detendría el proceso, pero puede definir su propio controlador. Apuesto a que Java VM lo hace.


En un entorno Unix, en el que la división por cero es signal dirigida a través de SIGFPE , la JVM habrá instalado un controlador de señal que atrapa el SIGFPE y, a su vez, SIGFPE una SIGFPE ArithmeticException . Si está interesado en los aspectos internos, vea, por ejemplo, man signal

Lo que creo que el OP está preguntando se basa en el hecho de que, hasta / a menos que un manejador SIGFPE esté en su lugar, la mayoría de los procesos tomarán la acción predeterminada al recibir esta señal, que es la terminación. Así, por ejemplo, un programa de C

int main (int argc, char** argv) { int n = 5 / 0; }

... si incluso se compila, será eliminado por la acción SIGFPESIG_DFL predeterminada. En cambio, el controlador de JVM emite la excepción RuntimeException (que se puede catch ) para que estas excepciones puedan manejarse de forma nativa.

Como indicaron otros, y solo para completar, de hecho, el SIGFPE generado a partir del kernel generalmente se mapea desde una interrupción especial desde el propio procesador; Por lo tanto, la "tubería" es algo así como

  • CPU error interrupción de interrupción → controlador de interrupción del kernel → SIGFPE SIG_DFL → proceso de muerte

o

  • CPU error trap interruption → controlador de interrupción del kernel → SIGFPE handler en JVM → RuntimeException ArithmeticException en el código de usuario

En plataformas no Unix el manejo es análogo.