如何修复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)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排...

数字魔盒阅读 852

封面图
刨根问底 Redis, 面试过程真好使
充满寒气的互联网如何在面试中脱颖而出,平时积累很重要,八股文更不能少!下面带来的这篇 Redis 问答希望能够在你的 offer 上增添一把🔥。

菜农曰17阅读 1k

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

JavaGuide6阅读 913

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

王中阳Go10阅读 2.1k评论 3

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

程序员大彬9阅读 1.1k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.9k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.4k评论 2

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