防止NullPointerException,是程序员的基本修养

简介: 大家好,我是指北君。PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!

如果一个Java程序到处抛出NullPointerException,那么我们可能会各种吐槽代码的质量。但是我们的项目又经常会抛出空指针异常,空指针异常必然常伴Java程序员。为此我们需要了解一些它喽,NullPointerException是Java中一个常见的RuntimeException,正如阿里的Java开发手册所说,对于Java程序员来说防止NPE是一种基本素养。今天我们盘一下NullPointerException。


1 NullPointerException以及其产生的场景


Java中定义:在应用程序中尝试使用null时会抛出异常。

其中以下的情况会产生NullPointerException

  1. 调用空对象的方法,
  2. 访问或者修改对象的字段值时
  3. 获取一个空对象(数组)的长度时,
  4. 修改或者回取null数组的一个元素或者值时
  5. 抛出异常时,抛出null。

以上是针对各种具体发生异常的情况,而对于日常使用过程中,可能抛出空指针异常的情景非常多,我们常用的手册中提到了以下几种NPE产生的实际使用场景。

  • 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。
  • 数据库的查询结果可能为null。
  • 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
  • 远程调用返回对象时,一律要求进行空指针判断,防止NPE。
  • 对于Session中获取的数据,建议进行NPE检查,避免空指针。
  • 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。

自动拆箱的NPE

如下代码中,代码逻辑出现问题的话,返回就是null。

60.png

同理如下代码也是同样的问题,均属于自动拆装箱时的NPE问题。

61.png

从集合取出的值直接使用会遇到NPE.

62.png


2 NPE处理以及如何避免

一般程序中需要处理NPE的地方随处可见,常见的NPE预防介绍如下几种方法。

2.1 如果是链式get这种推荐使用Optional进行处理

如下代码

63.png

如果程序中需要如此调用

64.png那么每一处均可能出现NullPointerException,如果我们写成下面这样。


65.png

if嵌套大军来袭,尔等还不下马受死。

上述if嵌套看起来的确很不美观,使用Optional可以比较容易的避免这些if判断,代码也会优雅不少。

下面不管哪一层为null返回均为Default。

66.png

或者使用如下方法,如果某一层为null则返回Supplier的执行结果。

67.png

2.2 主动进行参数检查,对方法中传入的参数进行检验

大部分的源码中使用的基础检查均会检查null

68.png

2.3 在已知字符串上使用equals(),equalsIgnoreCase()等方法。

69.png


2.4 尽量避免方法中返回null

一些返回数组或者List的方法,如果没有值,尽量返回空集合,避免返回null。


2.5 新版本中Java输出的NullPointException详细信息

Java14 可以使用增强异常信息来查看NullPointerException的详细错误信息。Java17已经默认开启。

70.png

使用Java17执行如下语句及NullPointException的输出


71.png

上述详情请见如下地址,欢迎来瓢。

https://github.com/javatechnorth/java-study-note/tree/master/multiThread/src/main/java/org/javanorth/currency/npt


总结

记住一句话:避免空指针异常的最好的方法就是总是检查哪些不是自己创建的对象。

Java新版本中的NullPointException的详细信息的输出对我们定位错误帮助很大,也是一个强有力的问题排查方法。

面试大全包括:包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!



相关文章
|
3月前
|
安全 Java 程序员
深入浅出Java异常处理
在Java的世界中,异常是程序运行中不可避免的一部分。它们就像是道路上的坑洼,需要我们谨慎驾驶以避免车辆损坏。本文将通过浅显易懂的语言,带你了解Java异常处理的基本概念、分类以及如何优雅地处理这些“道路坑洼”,让你的代码更加健壮和可靠。我们将一起探索try-catch-finally的奥秘,并学习如何使用throws关键字和自定义异常来提升代码的可读性和可维护性。准备好了吗?让我们开启这场Java异常处理的旅程吧!
|
8月前
|
安全 Java 程序员
🚀JAVA异常处理“三部曲”:try-catch-finally带你征服编程的星辰大海!
【6月更文挑战第18天】Java异常处理的`try-catch-finally`是编程探险中的导航系统,确保程序在异常时安全航行。`try`捕获异常,`catch`处理异常,`finally`保证关键清理代码执行。通过实例展示了如何在文件读取中应用这一机制,即使遇到错误也能优雅退出,它是Java程序员征服技术高峰的关键工具。
100 0
|
8月前
|
Java 程序员 开发者
【程序员必修课】那些年,我们踩过的Java坑:自定义异常,让你的代码不再“捉急”!
【6月更文挑战第19天】Java异常处理不仅是错误处理,更是程序健壮性的体现。自定义异常能提供更精确的错误信息,便于问题定位。通过继承`Exception`创建自定义异常类,如`NegativeValueException`,可使代码更优雅,降低维护难度。自定义异常还能携带额外信息,如错误代码,增强企业级应用的错误处理能力。善用自定义异常,提升代码质量和开发效率,是优秀编程实践的重要组成部分。
73 2
|
9月前
|
Java 程序员
java异常处理,Java异常处理的基本结构是什么?
java异常处理,Java异常处理的基本结构是什么?
95 0
|
8月前
|
安全 Java 程序员
🔥JAVA程序员必学“防身术”:try-catch-finally助你应对编程“危机”!
【6月更文挑战第18天】Java异常处理通过`try-catch-finally`确保程序安全。当异常发生时,如文件读取或网络请求失败,`catch`捕获异常避免程序崩溃,`finally`保证关键清理代码执行。例如,尝试读取不存在文件会抛出`FileNotFoundException`,`catch`捕获并打印错误,`finally`则提示读取结束。同样,网络请求异常也会被妥善处理。掌握此技术对Java程序员至关重要。
46 0
|
9月前
|
Java 程序员 编译器
【Java开发指南 | 第二十三篇】Java异常处理
【Java开发指南 | 第二十三篇】Java异常处理
61 1
|
9月前
|
Java
面试官:小伙子来说一说Java中final关键字,以及它和finally、finalize()有什么区别?
面试官:“小伙子,用过final关键字吗?” 我:“必须用过呀” 面试官:“好,那来说一说你对这个关键字的理解吧,再说一说它与finally、finalize()的区别” 我:“好嘞!
61 1
|
9月前
|
Java 编译器 开发者
Java异常处理最佳实践
【4月更文挑战第15天】本文探讨了Java异常处理的最佳实践,旨在提升代码质量和健壮性。主要内容包括理解检查异常和非检查异常的区别,选择合适的异常类型,提供详细异常信息,合理使用try-catch-finally语句,以及利用try-with-resources简化资源管理。此外,建议记录异常信息以辅助调试,并避免在finally块中抛出异常。遵循这些实践能有效管理错误,增强程序稳定性。
42 0
|
机器学习/深度学习 自然语言处理 算法
程序员的炫技代码写法
程序员的炫技代码写法
|
SQL 前端开发 Java
开发小技巧系列 - 如何避免NullPointerException?(一)
NPE是JAVA界面的常见问题,如何来避免呢?
119 0