java 三目算法_Java 中的三目运算符

写在前面:

三目运算符是我们经常在代码中使用的,a= (b==null?0:1); 这样一行代码可以代替一个 if-else,可以使代码变得清爽易读。但是,三目运算符也是有一定的语言规范的。在运用不恰当的时候会导致意想不到的问题。前段时间遇到(一个由于使用三目运算符导致的问题,其实是因为有三目运算符和自动拆箱同时使用(虽然自动拆箱不是我主动用的)。

一、三目运算符

对于条件表达式b?x:y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式从不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a?b:c?d:e将按a?b:(c?d:e)执行。

二、自动装箱与自动拆箱

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = new Class(parameters); 当我们创建一个Integer对象时,却可以这样: Integer i = 100;(注意:和 int i = 100;是有区别的 ) 实际上,执行上面那句代码的时候,系统为我们执行了: Integer i = Integer.valueOf(100); 这里暂且不讨论这个原理是怎么实现的(何时拆箱、何时装箱),也略过普通数据类型和对象类型的区别。我们可以理解为,当我们自己写的代码符合装(拆)箱规范的时候,编译器就会自动帮我们拆(装)箱。那么,这种不被程序员控制的自动拆(装)箱会不会存在什么问题呢?

三、问题回顾

首先,通过你已有的经验看一下下面这段代码。如果你得到的结果和后文分析的结果一致(并且你知道原理),那么请忽略本文。如果不一致,请跟我探索下去。

Map map = new HashMap();

Boolean b = (map!=null ? map.get("test") : false);

以上这段代码,是我们在不注意的情况下有可能经常会写的一类代码(在很多时候我们都爱使用三目运算符)。当然,这段代码是存在问题的,执行该代码,会报NPE.

1

Exception in thread "main" java.lang.NullPointerException

首先可以明确的是,既然报了空指针,那么一定是有些地方调用了一个null的对象的某些方法。在这短短的两行代码中,看上去只有一处方法调用map.get("test"),但是我们也都是知道,map已经事先初始化过了,不会是Null,那么到底是哪里有空指针呢。我们接下来反编译一下该代码。看看我们写的代码在经过编译器处理之后变成了什么样。

反编译后代码如下:

HashMap hashmap = new HashMap();

Boolean boolean1 = Boolean.valueOf(hashmap == null ? false : ((Boolean)hashmap.get("test")).booleanValue());

看完这段反编译之后的代码之后,经过分析我们大概可以知道问题出在哪里。((Boolean)hashmap.get("test")).booleanValue()的执行过程及结果如下:

hashmap.get(“test”)->null;

(Boolean)null->null;

null.booleanValue()->报错

好,问题终于定位到了。那么接下来看看如何解决该问题以及为什么会出现这种问题。

四、原理分析

通过查看反编译之后的代码,我们准确的定位到了问题,分析之后我们可以得出这样的结论:NPE的原因应该是三目运算符和自动拆箱导致了空指针异常。

那么,这段代码为什么会自动拆箱呢?这其实是三目运算符的语法规范。参见jls-15.25,摘要如下:

If the second and third operands have the same type (which may be the null type), then that is the type of the conditional expression.

If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

If one of the second and third operands is of the null type and the type of the other is a reference type, then the type of the conditional expression is that reference type.

简单的来说就是:当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。

所以,结果就是:由于使用了三目运算符,并且第二、第三位操作数分别是基本类型和对象。所以对对象进行拆箱操作,由于该对象为null,所以在拆箱过程中调用null.booleanValue()的时候就报了NPE。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Serverless 的喧哗与骚动

戳蓝字“CSDN云计算”关注我们哦!导读:从 2016 年 AWS 发布 Lambda 以来,全世界的开发者和云厂商对 Serverless 的热情在不断高涨。假设不想在开发应用程序并将其部署在服务器上的过程细节上花费精力,是否有一种简单的架构模型能够…

2018年最佳深度学习书单

摘要: AI人才缺口巨大?如果你想成为AI革命中的一员,那么你就必须要学习深度学习,看看这12本书,它们将成为你的利器!我相信你应该知道人工智能,尤其是深度学习在过去5年左右取得了不错的进步。 深…

(需求实战_01)_shell脚本 ftp协议下载文件

文章目录一、需求文档说明二、脚本解释/说明三、脚本内容3.1. 案例脚本3.2. 案例脚本升级一、需求文档说明 序号要求说明①协议使用ftp协议远程下载②文件类型.zip③文件名ac_UPpp④远程下载目录用户根目录(不需要切换目录)⑤本服务器下载存放目录/blacklist/xmldata/Lists 二…

双绞线传输距离_视频监控系统中布线常用传输线缆分类及制作方法

同轴电缆:同轴电缆同轴电缆可分为两种基本类型,基带同轴电缆和宽带同轴电缆。目前基带是常用的电缆,其屏蔽线是用铜做成的网状的,特征阻抗为75(如RG-8、RG-58等);宽带同轴电缆常用的电缆的屏蔽层通常是用铝冲压成的&am…

国庆出游,这个银行卡大小的充电宝一定要带

说到充电宝,不知道有没有人跟我有同样的烦恼:5000毫安容量小,不够用。10000毫安容量够用,但又大又笨重,拿在手里充电超累的,还占地方!尤其是旅行出差的时候,这种体验更加明显&#x…

HBase运维基础——元数据逆向修复原理

摘要: 鉴于上次一篇文章——“云HBase小组成功抢救某公司自建HBase集群,挽救30T数据”的读者反馈,对HBase的逆向工程比较感兴趣,并咨询如何使用相应工具进行运维等等。总的来说,就是想更深层理解HBase运维原理&#xf…

java并发编程代码示例_java并发编程之同步器代码示例

java并发编程之同步器代码示例发布时间:2020-09-08 16:53:41来源:脚本之家阅读:58作者:Blessing_H同步器是一些使线程能够等待另一个线程的对象,允许它们协调动作。最常用的同步器是CountDownLatch和Semaphore&#xf…

(需求实战_02)_ftp连接下载指定.zip类型文件

文章目录一、需求文档说明二、脚本解释/说明三、脚本内容一、需求文档说明 序号要求说明①协议使用ftp协议远程下载②文件类型.zip③文件名acd_UPIDDGWL④远程下载目录APEP/⑤本服务器下载存放目录/ablacklist/xmldata/Lists/PEP 二、脚本解释/说明 脚本拆解释义说明执行命令…

50多种适合机器学习和预测应用的API,你的选择是?(2018年版本)

摘要: 本文盘点了2018年以来人脸和图像识别、文本分析、自然语言处理、情感分析、语言翻译、 机器学习和预测这几个领域常用的API,读者可以根据自己需求选择合适的API完成相应的任务。对于做工程项目和搞科研的人来说,有现成的模块或工具使用…

谷歌10月15日发布 Pixel 4;高通以31亿美元收购与TDK公司权益;甲骨文、VMware就云技术及支持达成协议……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 荣耀 Play 3(图片…

天线巴伦制作和原理_10米段的春天 | 用自制环型天线+改装SDR接收器27MHz采访实录...

HF部分包括9个不同的波段,范围从1.8MHz到29.7MHz,它们通常也称…

学习笔记CB012: LSTM 简单实现、完整实现、torch、小说训练word2vec lstm机器人

摘要: 真正掌握一种算法,最实际的方法,完全手写出来。 LSTM(Long Short Tem Memory)特殊递归神经网络,神经元保存历史记忆,解决自然语言处理统计方法只能考虑最近n个词语而忽略更久前词语的问题…

(需求实战_03)_shell脚本 sftp协议下载文件

文章目录一、需求文档说明二、脚本解释/说明三、脚本内容3.1. 案例脚本3.2. 案例脚本升级一、需求文档说明 序号要求说明①协议使用sftp协议远程下载②文件类型.zip③文件名UPDATA④远程下载目录PEDP/⑤本服务器下载存放目录/app/xmldata/Lists 二、脚本解释/说明 脚本拆解释…

JAVA实现onvif的ptz控制_使用Onvif协议进行设备PTZ云台控制

接上一篇使用Onvif协议最重要的应用就是对设备进行PTZ云台控制,PTZ控制包含转动、变焦等,这里我们主要讨论常用的转动和变焦(也就是放大缩小)流程要进行设备PTZ控制,我们首先需要获取到设备的Device Service Address和此设备的用户名密码前两…

DataWorks支持PyODPS类型任务

摘要: 昨天,DataWorks推出了PYODPS任务类型,集成了Maxcompute的Python SDK,可在DataWorks的PYODPS节点上直接编辑Python代码操作Maxcompute,也可以设置调度任务来处理数据,提高数据开发效率。昨天&#xff…

vue base64图片不显示_技巧 | word中插入的图片显示不完整怎么办?

已经好久没有更新了,都快忘记有这个公众号存在了~这几个月发生了很多事情,工作上的任务也迟迟没有减轻,之前保持的日记也已经很久没有写了。但是觉得要是没有什么用什么方式将脑袋中时不时飘过的念头记录下来的话,过段时间就会完全…

重磅 | 华为发布绝杀计算战略!投15亿美元打造开放生态,全球最快AI训练集群Atlas 900,绝了!...

戳蓝字“CSDN云计算”关注我们哦! 文 | 阿晶、丹丹、王银发于上海华为HC大会现场出品 | CSDN云计算(ID:CSDNcloud) 科技的不断发展正逐步加速智能世界的到来。一直,华为致力于提供经济且充裕的算力,力图像使…

python制作圆形按钮_C#圆形按钮,非常漂亮动态

【实例简介】C#圆形按钮,非常漂亮动态 Button,有源代码和例子,这是网上很少有的,兄弟们快下载呀!【实例截图】【核心代码】PulseButton└── PulseButton├── Backup│ ├── PulseButton│ │ ├── ClassDiagram1.cd…

(需求实战_04)_定时压缩昨天指定文件并删除

文章目录一、需求文档说明二、脚本设置三、脚本内容一、需求文档说明 序号要求说明①协议使用sftp协议远程下载②文件类型.zip③文件名acd_UPIDDGWL④远程下载目录PEDP/⑤本服务器下载存放目录/ablacklist/xmldata/Lists 二、脚本设置 命令释义说明crontab -e编辑crontab8 0 …

90后实习生,是如何成长为阿里云分布式NoSQL领域专家

摘要: 我是亦征,本名王怀远,现在是阿里云存储服务团队的研发,正值五四青年节,受云栖社区邀请,来分享下自己的成长故事。从5年前第一次进入阿里云实习到如今,我一直都在表格存储TableStore团队&a…