java.lang.NullPointerException

java.lang.NullPointerException出现的几种原因及解决方案 java.lang.NullPointerException(空指针异常)是Java开发中常见错误,多因对null对象执行操作所致。常见原因包括:调用null对象的方法或属性、将null作为数组访问、null参与自动拆箱、集合未初始化就操作等。 解决方案涵盖:调用前判空(如if语句、Objects.requireNonNull)、初始化对象与集合、使用Optional类规避风险、借助IDE调试定位null源头等。掌握其成因与解决办法,能有效提升代码健壮性,减少程序崩溃隐患,是Java开发者必备技能。 阅读详情

之前一篇文章聊过异常排名《Java异常排行榜:哪个异常最常见?》,里面谈到国外一个网站对 Java 异常进行数据分析并排名,结果是 NullPointerException 排第一,本文正好对空指针异常做一个总结,希望对各位同学有所帮助。

在本文中,我展示了一个关于如何处理空指针异常的综合示例。在Java中,null 作为一个特殊值被对象引用,用来表示该对象当前指向的是一块未知内存数据。然而NullPointerException这个异常,则是程序在使用或访问一个对象的引用时,而该对象等于null则被抛出。

那些情况会引发该异常呢?

  • 被调用方法的对象为null。

  • 访问或修改一个null对象的字段。

  • 求一个数组为null对象的长度。

  • 访问或修改一个数组为null对象中的某一个值。

  • 被抛出的值是null并且是一个Throwable的子类。

  • 当你用null对象进行synchronized代码块。

NullPointerException 是 RuntimeException 的子类,因此,Javac 编译器并不会强迫你使用 try-catch 代码块来捕获该异常。

一、为什么需要 null ?

如上所述,null 是 Java 的一个特殊值。它在设计模式方面编码的过程中非常有用,例如空对象模式和单例模式。空对象模式提供了一个对象作为缺少给定类型对象的代理。而单例模式可以确保只创建一个类的实例,主要用于提供一个全局访问的对象。

例如,创建单例类的示例方法是将其所有构造函数声明为private,然后创建一个返回该类的唯一实例的公共方法,如下:

在这个例子中,我们声明了一个 Singleton 类的静态实例。该实例在 getInstance 方法内最多初始化一次。注意本例使用了 null 来确保创建的是唯一实例。

二、如何避免空指针异常

为了避免这种情况 NullPointerException ,请确保在使用运行程序之前,所有对象都已正确初始化。注意,当你声明一个引用变量时,即创建了一个指向对象的指针。在向对象请求方法或字段之前,您必须验证变量「指针」是否为空。

另外,如果引发异常,请使用堆栈中的异常信息进行跟踪。堆栈跟踪是由JVM提供,便于应用程序的调试。找到发生异常的方法和代码行,然后确定哪个引用为null。

在本文的余下部分,我们将介绍一些避免空指针异常的方法。但是,这些方法并非一劳永逸,因此,同学们在编写应用程序时应格外小心。

1、String变量与文本值比较

在编码过程中,String变量与文本值之间的比较是特别常见的。一般被比较的值可以是一个字符串或枚举值。因此,我们不要从空对象调用方法进行比较,而应考虑从文字值中调用方法。如下:

上面的代码片段则会抛出一个NullPointerException。但是,如果我们从文字中调用方法,那么执行流程通常会继续:

为什么呢?去看一下 JDK 源码 java.lang.String 便明白了。

2、检查方法的参数

在执行你自己的方法的主体之前,一定要检查方法传入的参数是否为空。只有在正确检查了参数后,才能继续执行该方法的相应逻辑。否则,您可以抛出一个 IllegalArgumentException 来通知调用方法所传递的参数有问题。

例如:

3、优先使用String.valueOf() 代替toString()

当您代码中的某个对象需要用字符串的方式来表示时,请避免使用该对象的toString方法;因为若你的对象引用为null,则会抛出 NullPointerException。

相反,考虑使用静态String.valueOf方法,该方法不会抛出任何异常,若对象引用为空,则打印「null」字符串。

有的同学可能会问为什么呢?还是那句话读源码 ^_^

下面是基类 Object 的 toString() 方法:

接着,咱们再来看看 String 的 valueOf() 方法做了什么呢?

4、使用三元运算符

该操作是非常有用的,可以帮助我们避免了NullPointerException。格式如下:

上面通过布尔表达式来判断。如果表达式结果为true,则返回value1,否则返回value2。我们可以使用三元运算符来处理空指针,如下所示:

如果str的引用为空,则消息变量将为空。否则,如果str指向实际数据,则该消息将保留它的前10个字符。

这里,一直有个疑惑困扰着我,为什么 Kotlin 这门语言去掉了三元运算符呢?知道的同学欢迎留言,一起来探讨~~~

5、创建返回空集合而不是null值的方法

一个非常好的操作是创建返回一个空集合的方法,而不是一个null值。因为你的代码可以遍历空集合并使用它的方法和字段,而不会抛出一个NullPointerException 。例如:

注意:要熟悉 Collections 这个集合工具类,里面有太多好用的方法了。

6、使用Apache的StringUtils类

Apache的Commons Lang是一个为 java.lang API 提供帮助工具的库,比如字符串操作方法。提供字符串操作的示例类是 StringUtils.java,它对输入的字符串进行了 null 判断。

你可以使用 StringUtils.isNotEmpty,  StringUtils.IsEmpty 和 StringUtils.equals 等方法,来避免NullPointerException。例如:

还是老规矩,咱们来读一下相应的源码。

7、习惯用 contains(), containsKey(), containsValue() 方法

如果您的程序在使用集合,请考虑使用contains,containsKey和containsValue方法。例如,从集合中找一个特定键的值:

在上面的代码片段中,我们未检查key是否真的存在于内部Map,因此返回的值可以是 null 。最安全的方法如下:

8、请检查使用的外部方法的返回值是否为 null

在编码中使用外部库是很常见的,这些库可能包含返回引用的方法,需确保返回的值不为 null 。另外,我们要养成在开发的过程中,养成阅读 Javadoc 的习惯,以便更好地理解其功能和返回值。

9、使用断言

断言在测试代码时非常有用,并且可以被使用,以避免 NullPointerException 。Java 断言是用 assert 关键字实现的,并抛出一个 AssertionError 。

请注意,您必须显式启用 JVM 的断言标志,一般在程序启动时,使用 –ea 参数来启用断言。否则,断言将被完全忽略。

使用 Java 断言的示例如下:

如果您执行上面的代码段并传递一个空参数getLength,则会出现以下错误消息:

最后,您可以使用测试框架  JUnit 提供的类 Assert 来使用断言。

10、单元测试

在测试代码的功能和正确性时,单元测试一般非常有用。因此,建议多花一些时间编写一些测试用例,来避免程序出现 NullPointerException。目前,我司的代码覆盖率要达到 95% 以上才能通过。

三、拥有 NullPointerException 的安全方法

1、访问类的静态成员或方法

当你的代码试图访问静态变量或类的方法时,即使对象的引用等于 null,JVM 也不会抛出一个 NullPointerException 。这是由于Java编译器在编译过程中将静态方法和字段存储在方法区或者常量池。因此,静态字段和方法不与对象相关联,而与类的名称相关联。

例如,下面的代码不会抛出NullPointerException:

注意,尽管 SampleClass 等于的实例 null 将会被正确执行。但是,对于静态方法或字段,最好以静态方式访问它们,比如SampleClass.printMessage()。

2、instanceof 操作符

instanceof 即使对象的引用等于 null,也可以使用该运算符。在 instanceof 操作时,参考值等于为null,不抛出 NullPointerException,而是返回 false 。例如,下面的代码片段:

正如预期的那样,执行的结果是:

四

保姆级教程:用ROS2 Humble + Gazebo Classic 从零搭建一个能键盘控制的差分AGV模型 本文提供了一份详细的ROS2 Humble与Gazebo Classic教程,指导用户从零开始搭建一个键盘控制的差分AGV模型。内容涵盖环境配置、Xacro文件设计、Gazebo仿真集成以及键盘控制实现,特别针对常见问题提供解决方案,帮助开发者快速掌握ROS2机器人仿真技术。 阅读详情

相关推荐

N32G003学习——第九章 第三节1 串口 发送

经过第九章前2节的学习,基础打下之后,开始敲代码。

qq_34525008的博客 1030

出现java.lang.NullPointerException的可能原因及解决方案

综上所述,最常见的原因是对象未被正确初始化或者有 null 值的参数、数组或集合。因此,开发人员需要避免这些情况并进行适当的错误处理。

IT学习小镇 7万+

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

java.lang.NullPointerException出现的几种原因以及解决

java.lang.NullPointerException出现的几种原因: 1、字符串变量未初始化 2、接口类型的对象没有用具体的类初始化,比如: Map map // 会报错 Map map = new Map(); //则不会报错了 3、当一个对象的值为空时,你没有判断为空的情况。 4、字符串与文字的比较,文字可以是一个字符串或Enum的元素,如下会出现异常 String str...

宜春 96万+

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

点云工具CloudCompare下载、安装与汉化

打开软件后,是英文界面,找到菜单栏【Display】-【Language Translation】,选择简体中文。进入官网后,点击菜单栏【Download】提示需要重启软件才能生效,点OK即可。重启软件后,已经是中文了。选择合适系统进行下载。常规软件安装流程即可。

sagima_sdu的博客 1万+

Java常见的十种“运行时异常”

下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了.",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。当应用试图调用某类的某个方法,而该类的定义中没有该方法的定义时抛出该错误。这个异常的解释是"程序遇上了空指针","...

nick665544的博客 1万+

NEU-DET 冷轧钢缺陷检测:基于 YOLOv8 的目标检测与可视化 UI 实现

冷轧钢的生产过程中,由于设备故障、工艺问题或者人为因素,钢板表面可能会出现多种缺陷,如划痕、裂纹、孔洞等,这些缺陷会严重影响钢材的质量。它比之前的版本(如 YOLOv5、YOLOv4)在速度和精度上都有显著提升,并且对硬件要求较低,适合进行工业界面和嵌入式系统的应用。这些版本相较于更大型的模型(如 YOLOv8x)具有更快的推理速度和较低的资源占用,适合工业生产线中的实时应用。通过将训练好的模型部署到工业生产线摄像头中,我们可以实现实时的缺陷检测,极大地提升生产效率和产品质量。

YOLO 736

已解决java.lang.NullPointerException异常的正确解决方法,亲测有效!!!

在Java编程中NullPointerException是最常见的运行时异常之一,这种异常在我们访问一个空引用变量中的字段、方法或者对象时会触发。

小明的Java问道之路 10万+

观测器选择与工程实践建议

摘要:永磁同步电机(PMSM)无传感器控制中,观测器选型需综合考虑应用场景、性能需求与成本。消费级(家电、工具)推荐滑模观测器(SMO),成本低、鲁棒性强;工业级(伺服、泵阀)适用扩展卡尔曼滤波器(EKF),精度高但计算复杂;车规级(EPS、主驱动)需混合观测器(SMO+EKF),兼顾全速域性能与可靠性。低速时需高频注入法,IPMSM更适用。SMO易实现但存在抖振,EKF调试复杂。未来趋势是混合架构与AI增强,提升适应性与性能。选型需权衡速度范围、电机类型、处理器能力及成本。

汽车软件开发 145

【网络安全】SSRF漏洞讲解

SSRF漏洞讲解一、初识SSRF漏洞1.定义2.产生原理3.会导致的危害4.常见产生SSRF的地方5.常见缺失函数二、SSRF漏洞利用1.函数(1) file_get_contents(2)fsockopen()(3) curl_exec()2.协议(1)file协议(2)http协议(3)dict协议(4)gopher协议三、绕过1.绕过方式(1)检查IP是否为内网IP(2)Host获取与DNS绕过(3)通过各种协议(4)利用URL解析器滥用问题四、修复修复方案五、小结 一、初识SSRF漏洞 1.定义

你在看屏幕的同时,屏幕也在注视着你 3180

解决java.lang.NullPointerException异常的正确方法

是Java运行时抛出的异常,当应用程序尝试访问或修改一个对象的成员(如字段、方法或数组元素),而这个对象是null时,就会抛出此异常。简单来说,就是你试图在null对象上执行操作。

qq_33545255的博客 5919

硅电容的工艺结构原理及选型参数总结

硅电容,也称为硅质电容或硅二极管电容,是一种特殊的电容器。它利用硅二极管的结构来实现电容的功能。本文对硅电容的工作原理,结构特点,选型参数及设计注意事项进行总结。

fydar的博客 2327

JDBC报java.lang.NullPointerException

import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; public class StudentDaolmpl implements StudentDao { @Override public ArrayList<Student> findall() throws Exception { Con.

must123452的博客 1379

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【Javaweb——tomcat常见错误】java.lang.NullPointerException

参考:java.lang.NullPointerException出现的几种原因以及解决 运行程序时,发生错误: 错误类型:java.lang.NullPointerException 错误的地方:两个doPost java.lang.NullPointerException出现的几种原因: 1、字符串变量未初始化 2、接口类型的对象没有用具体的类初始化,比如: Map map // 会报错 Map map = new Map(); //则不会报错了 3、当一个对象的值为空时,你没有判断为空的情况。 4、

学习如逆水行舟,不进则退 1万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

myeclipse 启动tomcat时报错: java.lang.NullPointerException java.lang.NullPointerException

2、myeclipse 启动tomcat时报错: java.lang.NullPointerException

Forviging_的博客 6470

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

安装完Rational Rose报错Java.lang.NullPointerException

此问题是出现在安装完RationalRose后,其具体问题如下:  问题描述: 软件启动时报错:Java.lang.ClassNotFoundException         退出软件时还报错:Java.lang.NullPointerException,而且还无法退出,最终只能借助资源管理器来结束软件   解决方法如下: 方法一:下载SHW32.DLL(118K)文件覆盖

刘杰 廊坊师范学院信息技术提高班十期 5994

CRASH问题:java.lang.NullPointerException

java.lang.NullPointerException 今天在家练习ListView的时候,遇到一个java.lang.NullPointerException的空指针异常,log如下: 2020-05-10 15:40:29.249 20436-20436/? E/k.myapplicatio: Unknown bits set in runtime_flags: 0x8000 2020-05-10 15:40:29.602 20436-20436/com.hpeak.myapplication E

HPeak的博客 3676

Junit 测试时报 java.lang.NullPointerException

java.lang.NullPointerException at org.eclipse.jdt.internal.junit4.runner.SubForestFilter.shouldRun(SubForestFilter.java:81) at org.junit.internal.runners.JUnit4ClassRunner.filter(JUnit4ClassRunner.j

u011597659的博客 8280

sqoop import报错java.lang.NullPointerException

sqoop抽取 c_appeal全量数据完成,耗时236秒。场景:从TDSQL抽数到hdfs报错,需要指定驱动类名。#执行sqoop命令。#执行sqoop命令。

码不停歇的博客 873

mybatis空指针java.lang.nullPointerException.

耗费了两天才知道问题在哪如何解决,真的是太蠢了,没办法记忆力越累越差,只能多动动手做下记录。 问题在spring boot整合mybatis时,调用service方法insert时,总是报错java.lang.nullPointerException. 尝试了多种方法,才知道这个错误首先可能是你的@Autowired注解没有正确注入,其次可能是mybatis的xml的配置有问题。 解决问题的方法我最终采用的是 @Component //* public class NettyServerHandler e

qq_39432521的博客 928

处理 java.lang.NullPointerException问题

今天打开Myeclipse10的时候,发现server窗口出现一堆问题,问题如标题,然后下方出现了一堆java.lang.NullPointerException的问题。 java.lang.NullPointerException     at com.genuitec.eclipse.ast.deploy.core.Deployment.(Unknown Source)     at

wo18341272518的博客 1350

android:java.lang.NullPointerException

android:java.lang.NullPointerException: Attempt to invoke virtual method ‘void android.widget.TextView.setText(java.lang.CharSequence)’ on a null object reference 这种空指针异常,一般是控件的绑定问题,出现这种异常,首先查看是否是绑定的是...

qq_40892075的博客 777

java.lang.NullPointerException:null

java.lang.NullPointerException: null错误原因及解决方法 抛出问题: 今天在调试项目时报出一个错误java.lang.NullPointerException: null,代码如下 XNIO-1 task-1] .p.c.s.c.PigxUserAuthenticationConverter : extractAuthentication===>>>authorities===>>>[{},{},{},{},{},{},{},{},{},

qq_43907515的博客 8万+

matlab java mac_macOS使用MATLAB报错java.lang.NullPointerException

使用MATLAB时冷不丁报了一堆的错...java.lang.NullPointerExceptionat sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAc...

weixin_35989968的博客 479

java IDEA空指针异常断点如何打详解java.lang.NullPointerException

@java IDEA 空指针异常断点如何打详解java.lang.NullPointerException # java IDEA空指针异常java.lang.NullPointerException断点如何打详解java.lang.NullPointerException 1、点击图中红点,可查看所有断点;; 2、点击图中+号,选择3号类型断点; 3、输入nullpoint...,会有代码提示,选中即可; 4、打完之后可在列表里查看,不想用的话直接去掉选中对号即可;

weixin_45268865的博客 7814
上一篇: 提升开发人员工作效率的在线工具
下一篇: thymeleaf 之 th:each迭代循环对象集合
msg1122
博客等级 码龄17年 8粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值