Java如何处理除以零?

2022-09-02 11:39:30

它是否只是在每次进行除法时检查除数是否与零不同(即使在JIT-ed代码中)?

我的意思是VM如何设法在不作系统杀死的情况下引发异常?


答案 1

在 Unix 环境中,在通过 被零除法引导的情况下,JVM 将安装一个信号处理程序,该处理程序将捕获 并反过来捕获 .如果您对内部结构感兴趣,请参阅例如signalSIGFPESIGFPEthrowArithmeticExceptionman signal

我相信OP所要求的是基于这样一个事实,即在/除非处理程序到位之前,大多数进程将在接收此信号时采取默认操作,即终止。因此,例如C程序SIGFPE

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

...如果它甚至编译,将被默认→操作杀死。相反,JVM 的处理程序发出(able),以便可以以本机外观的方式处理这些异常。SIGFPESIG_DFLcatchRuntimeException

正如其他几个人指出的那样,并且只是为了完整性,事实上,从内核生成的通常是从处理器本身的特殊中断映射的;因此,“管道”是这样的SIGFPE

  • CPU 错误陷阱中断→进程死亡→ →内核中断处理程序中断SIGFPESIG_DFL

  • CPU 错误陷阱中断→ JVM →用户代码中的内核中断处理程序→处理程序SIGFPERuntimeExceptionArithmeticException

在非Unix平台上,处理是类似的。


答案 2

Java像任何其他语言一样处理这种情况。除以零错误会生成处理器异常,从而触发中断。如果注册了处理程序,则中断由操作系统“读取”并转发到程序。由于 Java 注册了一个处理程序,因此它接收错误,然后将其转换为堆栈上行的处理程序。ArithmeticException


推荐