Java14 真的太香了,NullPointerException的处理新方式

news/2024/7/24 13:38:36 标签: java, python, 编程语言, jvm, 大数据

在Java语言中,处理空指针往往是一件很头疼的事情,一不小心,说不定就搞出个线上Bug,让你的绩效考核拿到3.25。

最近新出的Java14,相信大家都有所耳闻,那么今天就来看看,面对NullPointerException,Java14有哪些更好的处理方式呢?

1.传统的 NullPointerException

我们编码过程中呢,经常会使用链式调用的方式来写代码,这样写起来很方便,也很清晰,但是,一旦出现NullPointerException,那就头大了,因为你很难知道异常是在什么时候开始发生的。

举个简单的例子,就比如下面的代码,要找到公司某个员工的户籍所在地,我们这样来调用

String city = employee.getDetailInfos().getRegistryAddress().getCity();  

在链式调用的过程中,如果employee,getDetailInfos(),或者getRegistryAddress()为空,JVM就会抛出NullPointerException

那么导致异常的根本原因是什么?如果不使用调试器,很难确定哪个变量为空。而且,JVM也只会打印导致异常的方法、文件名和行号,仅此而已。那么下面,我将带大家了解Java 14如何通过JEP 358解决这个问题。

2.增强型 NullPointerException

SAP在2006年为其商业JVM实现了增强型的NullPointerException。2019年2月,它被提议作为OpenJDK社区的一个增强,之后很快,它成为了一个JEP。所以,该功能在2019年10月完成并在JDK 14版本推出。

本质上,JEP 358 旨在通过描述某个变量是 “null”来提高 JVM 生成的 “NullPointerException” 的可读性。JEP 358通过在方法、文件名和行号旁边描述为null的变量,带来了一个详细的NullPointerException消息。它通过分析程序的字节码指令来工作。因此,它能够精确地确定哪个变量或表达式是null。最重要的是,JDK 14中默认关闭详细的异常消息。要启用它,我们需要使用命令行选项:

-XX:+ShowCodeDetailsInExceptionMessages  

2.1 详细的异常信息

考虑在激活
ShowCodeDetailsInExceptionMessages标志的情况下再次运行代码:

Exception in thread "main" java.lang.NullPointerException:  
  Cannot invoke "RegistryAddress.getCity()" because the return value of  
"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$DetailInfos.getRegistryAddress()" is null  
  at com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException.main(HelpfulNullPointerException.java:10)  

这一次,从附加信息中,我们知道员工的个人详细信息丢失的注册地址导致了我们的异常。从这个增强中获得的信息可以节省我们调试所用的时间。

JVM由两部分组成详细的异常消息。第一部分表示失败的操作,这是引用为null的结果,而第二部分表示了null引用的原因:

Cannot invoke "String.toLowerCase()" because the return value of "getEmailAddress()" is null  

为了生成异常消息,JEP 358 重构了将空引用推送到操作数堆栈上的部分源代码。

3. 技术方面

现在我们已经很好地理解了如何使用增强的NullPointerException_s标识 _null引用,让我们来看看它的一些技术方面。

首先,只有当JVM本身抛出一个NullPointerException时,才会进行详细的消息计算,如果我们在Java代码中显示抛出异常,则不会执行计算。原因是因为:在这些情况下,很可能已经在异常构造函数中传递了一条有意义的消息。

其次,**JEP 358 ** 懒汉式地计算消息,这意味着只有当我们打印异常消息时才调用增强的NullPointerException,而不是当异常发生时就调用。因此,对于通常的JVM流程不应该有任何性能影响,在那里我们可以捕获并重新抛出异常,因为咱并不会只想打印异常消息。

最后,详细的异常消息可能包含源代码中的局部变量名。因此,我们可以认为这是一个潜在的安全风险。但是,只有在运行使用激活的-g标记编译的代码时,才会发生这种情况,该标记会生成调试信息并将其添加到类文件中。请考虑一个简单的示例,我们已编译该示例以包含以下附加调试信息:

Employee employee = null;  
employee.getName();  

当执行以上代码时,异常信息中会打印本地变量名称:

"com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"  
because "employee" is null  

相反,在没有额外调试信息的情况下,JVM 只提供它在详细消息中所知道的变量:

Cannot invoke  
  "com.developlee.java14.helpfulnullpointerexceptions.HelpfulNullPointerException$Employee.getName()"  
because "<local1>" is null  

JVM 打印编译器分配的变量索引,而不是本地变量名(employee)。

关于NullPointerException的处理到这里就结束了,通过Java14增强的NullPointerException,我们可以很快速的定位代码问题的原因所在,更快的调试代码,节约时间,提高效率。

已经安装了Java14的朋友可以试试看哦~


http://www.niftyadmin.cn/n/1685753.html

相关文章

sqlserver下载安装踩坑之路

sqlserver就是个垃圾。 大家知道&#xff0c;微软的东西是最多坑的。 但是客户要用&#xff0c;没办法。 之前一直安装不了&#xff0c;甩连接 https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2014-sp2 跳到最后&#xff0c;选择这个。胡乱填一顿信息之后就出…

【Python】列表介绍

Python列表学习主要学习以下5大点&#xff0c;分别是列表的应用场景、列表的格式、列表的常用操作、列表的循环遍历&#xff0c;列表的嵌套使用。这些Python基础知识点一下子是说不完的&#xff0c;会用一些文章来逐步的介绍&#xff0c;在Python自学网里也有许多列表相关的文章…

[Python] 6个字符串常用判断方法

所谓判断即是判断真假&#xff0c;返回的结果是布尔数据类型&#xff1a; True 或 False 以下是字符串常用操作方法中的6个判断方法&#xff0c;每个方法都有语法且利用案例来说明怎么使用&#xff0c;方法使用很简单&#xff0c;大家快速掌握就好。虽说字符串的一些操作方法很…

storm高可用及容错性初级

在大数据处理框架中&#xff0c;高可用或者说容错性是很重要的。 1、进程级别容错 1&#xff09;worker挂掉&#xff0c;supervisor会重启它。如果它一直重启失败导致无法发送心跳给nimbus&#xff0c;nimbus就会把它分配到别的机器上 面 2&#xff09;如果一个机器挂掉了 A、如…

到底什么是 IoC 和 AOP,区别是什么?一文搞懂

这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释 什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff1f;AOP 解决了什么问题&#xff1f;AOP 为什么叫做切面编程&#xff1f; 首先声明&#xff1a;IoC &…

【Python】字符串常用操作方法 (大小写转换、删除空白字符、字符串对齐)

字符串常用操作方法中的修改方法&#xff0c;分别是大小写转换、删除空白字符、字符串对齐&#xff0c;讲解它们的语法和用代码示例来更进一步的了解运用。Python基础教程网上也有很多&#xff0c;有视频的也有文章的&#xff0c;不过小编尽可能给0基础讲解清楚争取一次性性搞定…

storm和spark streaming 区别

1、区别&#xff1a;spark streaming不是真正的流处理框架&#xff0c;虽然也可以用作流处理框架&#xff0c;但是它的数据不是实时的&#xff0c;而是分段的&#xff0c;也就是你要定义进入数据的时间间隔&#xff1b;而storm是真正实时的。 2、优缺点&#xff1a;spark strea…

Spring Cloud Gateway 怎样全局通用异常处理

为什么需要全局异常处理 推荐阅读&#xff1a;999页阿里P7Java学习笔记在互联网上火了&#xff0c;完整版开放下载 在传统 Spring Boot 应用中&#xff0c; 我们 ControllerAdvice 来处理全局的异常&#xff0c;进行统一包装返回 /* 摘至 spring cloud alibaba console 模块处…