java除以0的异常_打破你的认知,java,除以0一定会崩溃吗?

2023-11-25 22:30

本文主要是介绍java除以0的异常_打破你的认知,java,除以0一定会崩溃吗?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

System.out.println("1/0=" + 1/0);

大叔的灵魂拷问:

上面的代码会崩溃吗?假如不会,会输出什么呢?

上面的代码会崩溃吗?假如不会,会输出什么呢?

上面的代码会崩溃吗?假如不会,会输出什么呢?

运行直接崩溃。

115009csib73q1svmzbe9d.jpg

## 代码2

我们再来看一行代码:

System.out.println("1.0/0=" + 1.0/0);

大叔的灵魂拷问:

会崩溃吗?假如不会,会输出什么呢?

会崩溃吗?假如不会,会输出什么呢?

会崩溃吗?假如不会,会输出什么呢?

输出日志:

115010dddhp7d4c7tz8esn.jpg

为什么浮点数除以0不会崩溃?

我们先说结论:

因为java的float和double使用了 IEEE 754 标准。

这个标准规定:浮点数除以0即是正无穷或负无穷。

Double类的界说

于是我们打开Double这个类来看看。

115011e6cf3pawz1f6wxh8.jpg

infinity单词的意思是:无穷大

NaN是 N ot a N umber的简称,也就是非数。

于是,我们发现, 正无穷大 的界说居然是 1.0f/0.0f 。 负无穷大 的界说为**-1.0f/0.0f**, 非数 的界说为 0.0f/0.0f

代码段3

我继续看一个代码段:

public static void main(String[] args) {

System.out.println("1.0/0=" + 1.0/0);

System.out.println("-1.0/0=" + -1.0/0);

double positiveInfinity = 1.0/0;

double negativeInfinity = -1.0/0;

System.out.println("(positiveInfinity==negativeInfinity)=" + (positiveInfinity==negativeInfinity));

System.out.println();

System.out.println("100.0/0=" + 100.0/0);

System.out.println("-100.0/0=" + -100.0/0);

System.out.println();

System.out.println("0.0/0=" + 0.0/0);

System.out.println("(-0.0==0.0)=" + (-0.0==0.0));

}

大叔的灵魂拷问:

上面的代码段会输出什么呢?

上面的代码段会输出什么呢?

上面的代码段会输出什么呢?

运行结果:

115011o8cs0xaugfs98cof.jpg

115011t6ebmeh0mpp3bwbt.jpg

接着,我们来看看,java语言规范( Java Language Specification)

docs.oracle.com/javase/spec…

115011wn1gggsj99z1179r.jpg

留意关键词1:

IEEE 754

java的单精浮点数float和双精浮点数double,符合IEEE 754标准。

IEEE 754: 二进制浮点数算术标准 ,这个标准描述了浮点数的存储以及处置处罚的一些规范。

关于IEEE754,百度百科

IEEE-754 references

留意关键词2

A NaN value is used to represent the result of certain invalid operations such as dividing zero by zero.

翻译过来的就是: NaN = 0.0/0.0

这也就是我们看到Double类里面NaN的界说。

我们把这个文档往下翻一些,会发现这么一句:

115011fob504oyfak5rkrf.jpg

for example, 1.0/0.0 has the value positive infinity, while the value of 1.0/-0.0 is negative infinity.

翻译成中文: 1.0/0.0 即是正无穷大,1.0/-0.0 即是负无穷大

于是我们明确,浮点数除以0并不会崩溃,他是 合法的 ,是 符合IEEE 754规范 。

也正是因为 IEEE 754 的规范就是这么规定的, 以是java才这么实现的 。

下面这段来自,维基百科,

en.wikipedia.org/wiki/Divisi…

115011cts1msh55htssz52.jpg

## 有什么用呢?

我们纵然知道了,浮点数除以0不会崩溃,知道了IEEE标准,有什么用呢?

很多人都会觉得,费这么大劲,理解了,浮点数除以0不会崩溃,能有什么用呢?平时我们写代码都不会除以0。这么骚的操作,我才不会这么干。

是的,这个操作是有点骚,你不会这么干并不代表其他同事不会这么做。而且很可能你这么干了自己不知道。

在我们写业务代码的时间,这个知识点,很少很少能用上。

但是当我们刚好碰到除以0导致的bug的时间,这个时间就非常有用。

尤其像android的app,用户在线上碰到的bug,我们无法复现,只能通过日志去分析排查时;

这个时间每个程序员都是福尔摩斯,根据一行行日志线索,共同实际代码,排查题目的可能性。

假如我们的认知是错误的,任何数除以0都会崩溃,那么我们的分析将会直接绕过原形去推理。于是得出结论,怎么可能有bug,不可能的。

于是浪费了很多时间,去网络线索,去颠覆我们固有的认知,才气找到原形。

假如我们一开始就有正确的知识,我们就会少走很多弯路。

大叔给大家,讲一个工作中真实的故事:

有位同事写了这么一段代码

/**

* 速率换算 米/秒

* @param distance 距离,单元米

* @param time 时间,单元秒

*/

float computeSpeed(float distance, long time){

return distance/time;

}

然后有一天突然某同事从另一个历程获取到数据传入这个函数。

再然后,突然有一天发现,速率体现一串很希奇的数字。

于是……接下来的故事,便如你们所想。

本来1小时就办理的bug,花了5个小时。

也正如,blog开头的弁言所表达的。不要藐视这些零零碎碎的知识点。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

这篇关于java除以0的异常_打破你的认知,java,除以0一定会崩溃吗?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424732

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2