当前位置: 首页 > 后端技术 > Java

踩坑了!0作为除数并不一定会抛出异常!

时间:2023-04-01 23:38:37 Java

大家好,我是伟伟。踩坑了,又踩坑了!这次踩到了一个特别无语的常识坑。知道真相的那一刻,整个人都麻木了。第一段代码:privatestaticdoublecalculate(doublea,intb){returna/b;}别问为什么不用BigDecimal来计算,反正程序里有类似这个的方法。正常使用没有问题:注意,我说的是“正常使用看起来还好”,非正常使用呢?当我看到输出是“Infinity”时,我什至揉了揉眼睛,认为自己太爱自己的工作,导致用眼过度,视力模糊。有一件事要说,我从来没有见过这东西。但是我知道这个词:在我有限的认知中,0不能作为约数。如果用作除数,则会抛出异常。但是这个简单的案例打破了我的认知。不仅没有抛出异常,还给了我一个“无穷大”。茫然中,我知道材料快来了。经过搜索,如果我在使用框架的过程中遇到问题,一般来说,我都是先自己调试一下,纠结一下是不是我的打开方式不对。但是问题太简单了,连调试的角度都找不到。该怎么办?只直接拿出程序员的祖传技能:面向浏览器编程。于是我输入了搜索关键字“JavaInfinity”,第一名是一个博客网站:我个人不是很喜欢这个网站,于是按照个人习惯再次搜索:找到了如下链接:https://www.cnblogs.com/zhisu...这篇文章我知道了,原来在我的认知中,0作为除数会抛出下面的异常,而且还有一个前提是“整型运算”:爪哇。lang.ArithmeticException:/byzero在Double和Float中定义了两个常量“正无穷大”和“负无穷大”:现在我知道0可以用作浮点运算中的除数。但为什么?什么Java设计成这样,为什么不一视同仁呢?博客里没有写,但是我知道要找到这个问题的答案,可以去这个地方:https://stackoverflow.com/所以我用关键字“JavaDoubleFloatInfinity”搜索:它是很好找我找到了这个链接:https://stackoverflow.com/que...提问者问的问题翻译了,和我之前遇到的问题一模一样:WhydoesdividingbyzerobyFloatorDouble不要抛出java.lang。ArithmeticExceptionL:/by零异常?本题高赞答案如下:该题的终极答案就隐藏在这个高赞答案中,小编为大家解析。揭开这个好评如潮的答案,其实只有一句话:简而言之,IEEE-754标准就是这么规定的,Java的Floating-PointOperations就是基于这个标准。其他部分均为参考。在这句话中,他提到了两个关键的东西:IEEE-754standardJava'sFloating-PointOperations,意思是Java的浮点运算是基于IEEE-754标准的。他给的超链接之一是Java语言规范:https://docs.oracle.com/javas...Java语言规范说:如果你要问我为什么,我只能告诉你,我遵守IEEE754国际标准。规格。所以,不要问:那么这个IEEE754是什么东西?我也不知道,所以看看吧:好家伙,年纪也不小了。IEEE代表InstituteofElectricalandElectronicsEngineers,电气和电子工程师协会。IEEE754的全称是IEEEStandardforFloating-PointArithmetic。表示由电气和电子工程师协会制定的浮点运算技术标准。标准,标准,你懂吗?一定要有一些标准,有些事情就好办了,不然就互相对抗,互相兼容,比较起来就不舒服。因此,该标准旨在解决不同浮点实现中的各种问题,这些问题使它们难以可靠地使用和移植。有了标准,大家都遵守,就好办了。该标准规定了如何处理异常:来吧,框架部分,和我一起大声朗读:除以零:对有限操作数的运算给出精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大。对于“除以0”异常,IEEE754规定对有限操作数的操作将得到精确的无限结果,例如1/0或log(0)。默认情况下,返回±无穷大。那么问题又来了?为什么标准中会有这样的要求呢?在上面提到的高赞回答中,给出了这样一个链接:https://web.archive.org/web/2...这个问题的答案隐藏在这个链接中:Excuseme:whydividebyzero(or溢出或下溢)不会停止程序或抛出错误?我在下面给了一个很长的回复。试了几次才明白,发现有点跑题了。我真的不知道这是什么意思。我个人认为它的意思就是:这个东西被广泛使用。为了程序的稳定性,我不想抛出异常终止程序,而且用户应该知道我的“除以0是一个无穷大的数”这样的设置。那到底是为什么呢?好吧,别问了,就到此为止吧,再问是不礼貌的,看完你只需要记住一句话:在Java中,如果除数为0,可能不会抛出ArithmeticException,不要形成这么固化的思维,会影响您排错的方向。最后,文章首发于微信公众号,欢迎关注: