Java中三目运算符不为人知的坑
一、思考题
以下代码可能有什么错误?为什么?
import java.util.HashMap;
import java.util.Map; public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("heihaozi", 1);
Integer i = map != null ? map.get("a") : Integer.MAX_VALUE;
System.out.println(i);
}
}
可能有小伙伴认为没什么问题,请再思考5秒钟......

二、什么错误?
首先回答第一个问题,可能有什么错误,实践出真知,我们直接运行一下就知道了。
JDK7,报出了空指针异常,截图如下:

JDK8,没有报异常,截图如下:

综上所述,在JDK7中,以上代码会有空指针异常。
三、什么原因?
那么为什么会有空指针异常呢?让我们反编译一下。
JDK7编译后反编译的代码:

可以看出,在JDK7中的三目运算时,其中的对象会被拆箱为基本类型进行操作。
在对象进行拆箱操作时,由于该对象为null,在拆箱过程中调用null.intValue()时就报了空指针异常。
JDK8编译后反编译的代码:

可以看出,在JDK8中的三目运算时,其中的基本类型会被装箱为对象进行操作,所以没有报异常。
四、解决方案
还在使用JDK7的小伙伴注意了,为了避免空指针异常,三目运算符中要把基础类型进行装箱,譬如这样:
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("heihaozi", 1);
Integer i = map != null ? map.get("a") : Integer.valueOf(Integer.MAX_VALUE);
System.out.println(i);
}
Java中三目运算符不为人知的坑的更多相关文章
- java中的那些坑
最近准备换工作,为了少让人家鄙视,就要狠狠地藐视这些面试题目.找了本电子书,发了有好多坑,都是特别简单,但是很少有人做对的题目.面对这样的题目,我却有一种兴奋的感觉,也许是因为一直做着重复的工作没有新 ...
- java 中==符号的坑
在某技术群看到这样的一个面试题目: 这是一个4年经验的java 从业者的答案. 你的答案是什么呢? 正确的答案是true. 为什么? 其实当使用String a="a"+" ...
- Java中常见的坑
概述 Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头.如果你习惯了别的语言,你读Java 的代码很 ...
- Java中浮点数的坑
基本数据类型 浮点数存在误差 浮点数有一个需要特别注意的点就是浮点数是有误差的,比如以下这段代码你觉得输出的什么结果: public class Demo { public static void m ...
- 在Java中==的一个坑
观察下面代码,输出结果是什么? public static void main(String[] args) { Integer p = 10000; Integer q = 10000; Syste ...
- 036、Java中三目运算符的使用
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Java中net.sf.json包关于JSON与对象互转的坑
在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递.数据的格式通常有2种:1.xml:2.JSON.通常来说都是使用JSON来传递数据.本文正是介 ...
- Java中net.sf.json包关于JSON与对象互转的问题
在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递.数据的格式通常有2种:1.xml:2.JSON.通常来说都是使用JSON来传递数据.本文正是介 ...
- Java中的三目运算符可能出现的问题
你真的了解Java中的三目运算符吗? 原创 2018-04-27 刨根问底的 Hollis Hollis Hollis 微信号 hollischuang 功能介绍 一个对Coding有着独特追求的人. ...
随机推荐
- 读取本地outlook邮件内容
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Python_字符串连接
#join() 与split()相反,join()方法用来将列表中多个字符串进行连接,并在相邻两个字符串之间插入指定字符 li=['apple','peach','banana','pear'] se ...
- 读《图解HTTP》有感-(简单的HTTP协议)
写在前面 该章节主要是针对HTTP1.1版本进行基础的讲解 正文 HTTP协议能做什么: http协议用于客户端和服务端之间的通信 HTTP协议通信方式: http协议是基于请求响应的方式来实现消息通 ...
- scrapy中 Mongo的存储
import pymongo MONGO_HOST = 'localhost' MONGO_PORT = 27017 MONGO_DB = 'today' MONGO_COLL = 'mm' clas ...
- 前端工程化(三)---Vue的开发模式
从0开始,构建前后端分离应用 导航 前端工程化(一)---工程基础目录搭建 前端工程化(二)---webpack配置 前端工程化(三)---Vue的开发模式 前端工程化(四)---helloWord ...
- capwap学习笔记——初识capwap(三)(下)
2.5.6.25 Image Data to Reset WTP下载image后重启,重新设置DTLS连接 ¢ WTP: ü 当image的下载完成,或者ImageDataStartTimer定 ...
- SQLMap入门之在Windows上安装SQLMap
前言: SQLMap是一个开放源代码的sql注入工具,SQLMap是使用Python语言开发成的,他的运行需要有Python环境的支持.写这篇文章时我使用的SQLMap版本是"sqlmap- ...
- Scrapy 1.4 文档 05 命令行工具
在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scr ...
- PyCharm 专题
pycharm常用设置 pycharm中的设置是可以导入和导出的,file>export settings可以保存当前pycharm中的设置为jar文件,重装时可以直接import settin ...
- Containerd 简介
我们可以把 docker 抽象为下图所示的结构(此图来自互联网): 从图中可以看出,docker 对容器的管理和操作基本都是通过 containerd 完成的. 那么,containerd 是什么呢? ...