Java如何处理除以零?
2022-09-02 11:39:30
它是否只是在每次进行除法时检查除数是否与零不同(即使在JIT-ed代码中)?
我的意思是VM如何设法在不作系统杀死的情况下引发异常?
它是否只是在每次进行除法时检查除数是否与零不同(即使在JIT-ed代码中)?
我的意思是VM如何设法在不作系统杀死的情况下引发异常?
在 Unix 环境中,在通过 被零除法引导的情况下,JVM 将安装一个信号处理程序,该处理程序将捕获 并反过来捕获 .如果您对内部结构感兴趣,请参阅例如signal
SIGFPE
SIGFPE
throw
ArithmeticException
man signal
我相信OP所要求的是基于这样一个事实,即在/除非处理程序到位之前,大多数进程将在接收此信号时采取默认操作,即终止。因此,例如C程序SIGFPE
int main (int argc, char** argv) { int n = 5 / 0; }
...如果它甚至编译,将被默认→操作杀死。相反,JVM 的处理程序发出(able),以便可以以本机外观的方式处理这些异常。SIGFPE
SIG_DFL
catch
RuntimeException
正如其他几个人指出的那样,并且只是为了完整性,事实上,从内核生成的通常是从处理器本身的特殊中断映射的;因此,“管道”是这样的SIGFPE
SIGFPE
SIG_DFL
或
SIGFPE
RuntimeException
ArithmeticException
在非Unix平台上,处理是类似的。
Java像任何其他语言一样处理这种情况。除以零错误会生成处理器异常,从而触发中断。如果注册了处理程序,则中断由操作系统“读取”并转发到程序。由于 Java 注册了一个处理程序,因此它接收错误,然后将其转换为堆栈上行的处理程序。ArithmeticException