Java基础---自动装箱拆箱导致的NullPointerException问题

news2024/12/28 21:17:51

目录

问题描述

代码

简单分析


  • 问题描述

  • 在返回一个类型是boolean的方法中,将从map里面取出的Boolean类型的值直接返回,代码一运行,执行到这立即出现了空指针问题(问题一)
  • 于是就使用log分析,将字符和Boolean类型的值拼接打印,结果log处居然也出现了空指针问题(问题二)
  • 仔细想了想包装类型不就是对象么,取到了空值报异常不是很正常,改了改果然能运行了
  • 代码

  • 问题一

  • 问题二

  • 简单分析

  • 问题一
    • 在第一段代码中,直接返回了stateMap.get(id),这里拿到的值实际是Boolean类型的null值,作为boolean类型返回需要进行拆箱
    • 而null值拆箱,问题便不言而喻了
    • 而且因为Boolean类型是一个类,所以Boolean类型对象的默认值是null
    • 这直接当boolean使用明显不对,包装类型并不能完全代替基本类型
    • 稍微修改一下进行解决,如下:

  • 问题二
    • 前面说到了Boolean类型的值是一个对象,那直接使用字符串拼接不应该拼接出null显示吗?
    • 如下:

    • 然而实际情况是抛了空指针异常,这又是什么问题?
    • 既然是拼接出了问题,首先了解一下字符串拼接的原理
    • Java使用 “+” 拼接字符串看起来像操作符重载,实际上并不是
    • Java是不支持运算符重载的,这其实只是Java提供的一个语法糖
    • 反编译代码后会发现,其实调用的是StringBuilder的append方法,如下:

    • 编译,反编译上面的代码:

    • 所以,实际上拼接会调用append方法,那看一下append方法:

    • 这里有很多重载的方法,其中符合使用的有两个:

    • 那到底重载的时候选择哪个方法呢?
    • 这里其实很好理解,自动拆箱发生在什么地方?
    • 代码执行的时候发生在什么地方?
    • 理解清楚了,就知道到底会调用哪个方法了
      • 装箱和拆箱是编译器认可的,而不是虚拟机
      • 编译器在生成类的字节码时,插入必要的方法调用
      • 虚拟机只是执行这些字节码
    • 对于装箱和拆箱,实际上打开源码看一下就明白
    • 以Boolean为例,装箱就是调用Boolean的valueOf方法选择预置的 TRUE or FALSE 对象(已经创建好的static对象)
    • 拆箱就是调用Boolean对象的booleanValue方法返回value
    • 所以既然装箱和拆箱是编译器执行的,那毫无疑问,这里肯定是会执行append(boolean b)这个方法了
    • 也就是说,Boolean类型的值在拼接时,首先需要调用它的booleanValue()方法完成拆箱
    • 然而和第一个问题一样,null对象怎么调用方法,自然抛出了空指针异常

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

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

相关文章

Java之深入探究IO流操作与Lambda表达式

深入探究Java IO流操作与Lambda表达式的优雅结合 1. IO流1.1 IO流的概念1.2 IO流的分类1.3 常见的IO流操作1.3.1 字节流操作1.3.2 字符流操作1.3.3 缓冲流 2. Lambda表达式2.1 Lambda 表达式使用条件2.2 Lambda 表达式的分类2.3 Lambda 表达式在 IO 流操作中的应用2.4 常见的 I…

虹科新品 | 振动监测:提升风能行业效率与安全!

一、 CTC概览 服务于工业振动分析市场ISO 9001认证设计和测试以满足工业环境的实际需求无条件终身保修兼容所有主要数据采集器、分析仪和在线系统美国制造 二、风能行业:为什么要进行监测? 在风能行业,振动监测是一项至关重要的节约成本和安…

详解低代码和无代码的区别

低代码是近几年被炒的很热的一个概念,与之同样热议的还有无代码。那么针对这两个概念,背后的价值、面向的人群、发展的趋势是什么? 一、低代码 vs 无代码 低代码是什么? 低代码(Low-Code)这一概念是2014年一…

js 额外知识

加油,嘎嘎嘎 🤣 💕💕💕 文章目录 一、 with二、 eval 函数三、严格模式三、严格模式的限制 一、 with with语句 扩展一个语句的作用域链。 会形成一个自己的作用域不建议使用with语句,因为它可能是混淆错误…

Centos7.9_解决每次重启机器配置的java环境变量都需要重新source /etc/profile才生效的问题---Linux工作笔记060

这种情况需要把环境变量,java的环境变量在/root/.bashrc文件中也放一份,注意这个文件是隐藏的,默认是,需要进行ls -a才能显示. #jdk export JAVA_HOME/lib/jvm export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/b…

STM32F105RCT6 -- ST-Link ITM Trace printf 打印日志

1. STM32 可以配置UASRT,使用串口来打印日志,还有另外一种方式,使用ITM 调试功能来打印日志, 主要使用到的三个函数 core_cm3.h 1.1 发送函数 static __INLINE uint32_t ITM_SendChar(uint32_t ch),相当于串口的发送函…

锚框【目标检测】

生成多个锚框 假设输入图像高为h,宽为w,我们以图像每个像素为中心生成不同形状的锚框,缩放比 s∈(0,1],宽高比为r>0。那么锚框的宽度和高度分别为和。当中心位置给定时, 已知宽和高的锚框是确定的。缩放比为锚框高与图像高的比值,然后得到一个正方形锚框面积。 ​​…

pytest接口自动化测试框架搭建的全过程

目录 一. 背景 二. 基础环境 三. 项目结构 四、框架解析 pytest是Python的一种单元测试框架,可用来组织用例执行,用例断言,下面这篇文章主要给大家介绍了关于pytest接口自动化测试框架搭建的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 一. 背景 Pyte…

sql高频面试题-连续完成两个指定动作的用户统计

用户行为分析 业务背景 某购物APP最近上线了一个新功能,用户签到后可以跳转到大转盘抽奖,抽奖获得的奖金可以抵消购物的费用,以此来培养用户使用app的习惯。 数据表介绍 现有一张用户行为表action_log,主要字段如下&#xff0c…

7天获英国名校邀请函|CSC青骨获批成功案例补记

Q老师要求2周内拿到邀请函且必须是世界排名前200名的高校。我们在第7天就获得了世界百强名校-英国兰卡斯特大学的邀请函,导师的研究方向完全契合,提前实现了Q老师的委托目标,使其顺利获批CSC青骨项目。特别提示:青骨项目国内派出院…

5. 服务发现

当主机较少时,在抓取配置中手动列出它们的IP地址和端口是常见的做法,但不适用于较大规模的集群。尤其不适用使用容器和基于云的实例的动态集群,这些实例经常会变化、创建或销毁的情况。 Prometheus通过使用服务发现解决了这个问题&#xff1…

测试人员该怎样写软件缺陷报告?

软件测试过程中,每个公司都制订了软件的缺陷处理流程,每个公司的软件缺陷处理流程不尽相同,但是它们遵循的最基本流程是一样的,都要经过提交、分配、确认、处理、复测、关闭等环节,如图1所示。 缺陷处理流程 关于图1所…

Linux:shell脚本:基础使用(3)

for循环语句 语句格式 for for变量 in 取值列表(可以是变量或者自己定义) do 循环内容 done 工作方式就是通过取值列表去判断循环的次数,每次循环的同时把列表一行的值赋予到for变量。取值方式如果是数字,那就通过数字去…

MySQL 索引 详解

一、索引概述 索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上…

设计师常用的6款UI设计工具

在选择UI设计工具时,设计师需要关注UI设计工具的功能。市场上有很多设计UI的工具。既然UI设计工具这么多,设计师应该如何选择UI设计工具?本文盘点了6种流行的UI设计工具,快来看看。 1.即时设计 即时设计是一款免费的在线 UI 设计…

利用ChatGPT绘制思维导图——以新能源汽车竞品分析报告为例

随着人们对环境保护的日益关注和传统燃油汽车的限制,全球范围内对新能源汽车的需求不断增长。新能源汽车市场的激烈竞争使得了解各个竞品的特点和优劣成为关键。然而,针对这一领域的详尽竞品分析却常常需要大量时间和精力。 在此背景下,人工智…

行业追踪,2023-08-10

自动复盘 2023-08-10 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

maven Jar包反向install到本地仓库

maven Jar包反向install到本地仓库 需求实现 需求 项目打包时报错,缺少一个jar包。 但是在maven仓库都找不到此jar包,其他人提供了这个jar包。 需要把这个jar包install到本地仓库,使项目能正常打包运行。 实现 使用git bash命令执行以下脚…

qt5.15.2 使用mysql8.1

报错&#xff1a; QMYSQL driver not loaded 报错&#xff1a;无 QMYSQL 使用 QStringList drivers QSqlDatabase::drivers(); //获取现在可用的数据库驱动 foreach(QString driver, drivers) qDebug() << driver; “QSQLITE” “QMARIADB” “QMYSQL” “QMYSQL3” “…

UML-状态图

目录 状态图 状态图的图符 状态机 状态 ​转换 电话机状态图 活动图和状态图区别&#xff1a; 状态图 状态图(Statechart Diagram)是描述一个实体基于事件反应的动态行为&#xff0c;显示了该实体如何根据当前所处的状态对不同的事件做出反应。通常我们创建一个UML状态…