从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • JavaSE

    • 我的 Java 学习路线
    • 安装 Java
    • Java 数据类型

    • Java 多版本配置
    • 面向对象

    • Java 核心类

    • IO

    • Java 与时间

    • 异常处理

      • 什么是异常
      • 捕获和抛出异常
      • 深入异常
      • 自定义异常
      • 空指针异常
        • 演示
        • 处理 NPE
        • 定位 NPE
        • 小结
      • return 和 finally 谁先执行
    • 哈希和加密算法

    • Java8 新特性

    • 网络编程

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaSE
  • 异常处理
2023-02-13
目录

空指针异常

# 空指针异常

在所有的 RuntimeException 异常中,Java 程序员最熟悉的恐怕就是 NullPointerException 了。

# 演示

NullPointerException 即空指针异常,俗称 NPE。如果一个对象为 null,调用其方法或访问其字段就会产生 NullPointerException,这个异常通常是由 JVM 抛出的,例如:

public class LearnExceptionDemo6 {
  public static void main(String[] args) {
    String s = null;
    System.out.println(s.toLowerCase());
  }
}
1
2
3
4
5
6

运行结果:

Exception in thread "main" java.lang.NullPointerException
        at LearnExceptionDemo6.main(LearnExceptionDemo6.java:4)
1
2

指针这个概念实际上源自 C 语言,Java 语言中并无指针。我们定义的变量实际上是引用,Null Pointer 更确切地说是 Null Reference,不过两者区别不大。

# 处理 NPE

如果遇到 NullPointerException,我们应该如何处理?首先,必须明确,NullPointerException 是一种代码逻辑错误,遇到 NullPointerException,遵循原则是早暴露,早修复,严禁使用 catch 来隐藏这种编码错误:

// 错误示例: 捕获NullPointerException,但不处理!
try {
    transferMoney(from, to, amount);
} catch (NullPointerException e) {
}
1
2
3
4
5

好的编码习惯可以极大地降低 NullPointerException 的产生,例如:

例如在成员变量在定义时初始化:

private String name = "";
1

如果方法有返回,尽量不返回 null,而是返回空字符串 ""、空数组

public String[] readLinesFromFile(String file) {
    if (getFileSize(file) == 0) {
        // 返回空数组而不是null:
        return new String[0];
    }
    ...
}
1
2
3
4
5
6
7

这样可以使得调用方无需检查结果是否为 null。

# 定位 NPE

如果产生了 NullPointerException,例如,调用 a.b.c.x() 时产生了 NullPointerException,原因可能是:

  • a 是 null;
  • a.b 是 null;
  • a.b.c 是 null;

确定到底是哪个对象是 null 以前只能打印这样的日志:

System.out.println(a);
System.out.println(a.b);
System.out.println(a.b.c);
1
2
3

从 Java 14 开始,如果产生了 NullPointerException,JVM 可以给出详细的信息告诉我们 null 对象到底是谁。我们来看例子:

public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println(p.address.city.toLowerCase());
    }
}

class Person {
    String[] name = new String[2];
    Address address = new Address();
}

class Address {
    String city;
    String street;
    String zipcode;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

可以在 NullPointerException 的详细信息中看到类似 ... because "<local1>.address.city" is null,意思是 city 字段为 null,这样我们就能快速定位问题所在。

这种增强的 NullPointerException 详细信息是 Java 14 新增的功能,但默认是关闭的,我们可以给 JVM 添加一个 -XX:+ShowCodeDetailsInExceptionMessages 参数启用它:

java -XX:+ShowCodeDetailsInExceptionMessages Main.java
1

# 小结

NullPointerException 是 Java 代码常见的逻辑错误,应当早暴露,早修复;

可以启用 Java 14 的增强异常信息来查看 NullPointerException 的详细错误信息。

上次更新: 2024/10/1 16:58:10
自定义异常
return 和 finally 谁先执行

← 自定义异常 return 和 finally 谁先执行→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式