如何修复NullPointerException异常

java.lang.NullPointerException 是JAVA中最容易出现的异常,也是非常困扰编程新手的问题。本文对空指针异常的发生原因进行说明,并对如何解决空指针异常给出了快捷方法。

什么是空指针异常

NullPointerExceptions 是当您尝试使用未指向任何对象的引用时,发生的异常。对空引用调用方法或尝试访问空引用的字段将触发NullPointerException。比如如下代码:

public class Dm2box {
    public static void main(String[] args) {
        Object obj;
        obj.hashCode();
    }
}

上述代码会在会在obj.hashCode()执行时抛出空指针异常,其原因是obj变量还未指向任何实例对象。

第二行声明了一个类型为Object的变量obj,但它实际上并不包含原始值,只包含一个指针,由于您还没有说要指向什么,Java 将其设置为null,这意味着“我没有指向任何内容”。在第三行进行hashCode()方法执行时,由于该变量并为指向实际内存中的对象,所以会导致无法执行任何方法并抛出空指针异常。

上述这就像在一个班级中,还没有让学生就坐,却让第一排第一列座位上的学生回答问题,这时座位上还没有对应的学生,自然也就无法有人回答问题,最终导致回答问题这个行为因为座位上无人从而无法执行。如上的例子中,班级就是内存空间;学生就是内存中的对象;座位编号就是变量obj;回答问题就是hashCode()方法;没有对应人能够执行问题回答就是空指针异常。

编写时如何避免

因为NullPointerExceptions继承自RuntimeExcetion,所以其无需在方法声明中进行明确描述。在源码编译时编译器也无法对此类未声明的异常进行检查,仅能通过在编写时尽量避免其异常的发生。故在编写时需要遵循以下原则进行编写,达到避免的目的:

  • 所有变量在声明后应当尽快指向对应引用对象,在未指向明确引用对象时不对该变量进行任何操作。
  • 在public方法定义时,所有入参应当进行必要的非空检查,如果为空抛出有含义的异常或指向明确的对象继续后续执行。private方法因为无法被其他类进行直接引用,是否需要检查可以根据实际情况来看。

异常发生后诊断

在Java1.4之后对于空指针异常会给出明确提示,如下:

in thread "main" java.lang.NullPointerException: Cannot invoke "java.util.List.size()" because "list" is null

根据异常提示可以快速定位到具体的发生异常的调用栈信息定位到具体的源码行,再根据异常信息中提示的变量名就可以快速找到异常点。参照上个章节进行处理即可。

版权声明,本文首发于 数字魔盒 https://www.dm2box.com/ 欢迎转载。
1 声望
2 粉丝
0 条评论
推荐阅读
大厂面试-选择排序的特点与适用场景是什么?
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排...

数字魔盒阅读 880

封面图
一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go31阅读 2.3k评论 1

封面图
计算机网络连环炮40问
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬13阅读 1.7k

万字详解,吃透 MongoDB!
MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统,由 C++ 编写的。MongoDB 提供了 面向文档 的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常...

JavaGuide8阅读 1.6k

封面图
花了半个小时基于 ChatGPT 搭建了一个微信机器人
相信大家最近被 ChatGPT 刷屏了,其实在差不多一个月前就火过一次,不会那会好像只在程序员的圈子里面火起来了,并没有被大众认知到,不知道最近是因为什么又火起来了,而且这次搞的人尽皆知。

Java极客技术12阅读 3k评论 3

封面图
数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.2k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.6k评论 4

封面图
1 声望
2 粉丝
宣传栏