当前位置: 首页 > 面试题库 >

Java如何处理零除?

苏君昊
2023-03-14
问题内容

它是否只是在每次除法后检查除数是否等于零(即使在JIT版代码中)?

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


问题答案:

在一个Unix环境,在这种划分被零是signal通过主导SIGFPE,JVM将已安装的陷阱的信号处理程序SIGFPE,进而throwS上的ArithmeticException。如果您对内部结构感兴趣,请参见例如man signal

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

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

…即使编译,也会被默认的SIGFPE
SIG_DFL操作杀死。JVM的处理程序改为发出(catch能力),RuntimeException以便可以以本机似的方式处理这些异常。

正如其他一些人指出的那样,并且仅仅是为了完整性,事实上SIGFPE,内核生成的代码通常是根据处理器本身的特殊中断来映射的。因此,“管道”就像

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

要么

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

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



 类似资料:
  • foo(8073)调用foo(8074) foo(8074)调用foo(8075),foo(8075) foo(8074)记录自身并调用bar(8075), foo(8074)死亡,foo(8073)捕获它,记录自己并调用bar(8074) bar(8074)调用bar(8075),bar(8074)死亡,因此bar(8074)记录自己 从所有方法返回,并优雅地关闭 我明白了,一切都很好。所以有一

  • 我正在处理UDF中的空值,该UDF在数据帧(源自配置单元表)上运行,该数据帧由浮点数结构组成: 数据帧()具有以下架构: 例如,我想计算x和y的总和。请注意,我不会在以下示例中“处理”空值,但我希望能够在我的udf中检查、或是否。 第一种方法: 如果<code>struct是否为空,因为在scala中<code>浮点不能为空。 第二种方法: 这种方法,我可以在我的udf中检查是否为空,但我可以检查

  • 有没有办法过滤掉所有大于最大值的值,这些值可以存储在使用StreamAPI的Long中?目前的情况是,您可以在前端使用简单的搜索条搜索某些客户,通过使用他们的ID。例如:如果您在这两个ID之间放置一个“隔离器”,一切都正常。但是如果您忘记了“隔离器”,我的代码试图将解析为Long,我想这就是问题所在。这会在尝试搜索后导致一个数字格式异常。有没有办法过滤掉这些因为太大而无法解析为Long的数字? 谢

  • 问题内容: 如何用Java 处理? 问题答案: 我不确定“句柄”是什么意思。 您当然可以捕获该错误: 但这很可能是个坏主意,除非您确切地知道自己在做什么。

  • 问题内容: 在开发高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由来自JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载

  • 问题内容: 在开发一个高度基于XML的Java应用程序时,我最近在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java Plugin Framework ,似乎无法将dom4j创建的XML文档转换为Batik的 SVG规范实现。 在控制台上,我了解到发生了错误: 我认为问题是由JVM的原始类加载器与插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载