JDK14的新特性NullPointerExceptions的使用

JDK 14的新特性:更加好用的NullPointerExceptions

让99%的java程序员都头痛的异常就是NullPointerExceptions了。NullPointerExceptions简称NPE,它是运行时异常的一种,也是java程序中最最容易出现的异常。

出现了NullPointerExceptions之后我们怎么处理呢?

一般情况下就是看日志,看一下到底哪一行出错了。如果这一行只有简单的代码,那么很容易就找到问题所在。

要命的是如果这一行很复杂,那么找出问题就不是那么容易了。很有可能我们需要向前debug100行,向后debug50行才能解决。

最大的问题就是如果这个异常出现在线上环境,debug是不可能debug了。这时候就要靠你的肉眼,你对程序的敏感程度再加上你的专业素养,才能从万花丛中找出那个问题。

举个例子,我们定义一个CustUser和Address:

@Data
public class CustUser {
 private String userName;
 private Address address;
}
@Data
public class Address {
 private String addressName;
}

再来产生一个NPE:

@Slf4j
public class NPEUsage {

 public static void main(String[] args) {
  Address address=new Address();
  CustUser custUser=new CustUser();
  custUser.setAddress(address);
  log.info(custUser.getAddress().getAddressName().toLowerCase());
 }
}

上面代码中的最后一行,因为addressName是空的,所以在调用toLowerCase的时候会抛出NPE。运行结果如下:

Exception in thread "main" java.lang.NullPointerException
at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)

上述异常只告诉我们有一个NPE在第16行。但是16行有一长串代码,到底是哪里报了这个异常呢?

简单代码,比如上面我们提的例子,简单分析一下就知道问题所在了。但是对于那么犹如蛛网一样的复杂的项目,找起来就很难了。

别害怕,JEP 358: Helpful NullPointerExceptions就是用来解决这个问题。

还是上面的例子,还是上面的配方和味道,我们只需要在运行时加上下面的参数:

-XX:+ShowCodeDetailsInExceptionMessages

运行一下:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because the return value of "com.flydean.nullpointerexceptions.Address.getAddressName()" is null
at com.flydean.nullpointerexceptions.NPEUsage.main(NPEUsage.java:16)

看到不同之处了吗?完整的出错信息被打印出来了。你苦思冥想的问题解决了。

这个特性好是好,但是默认情况下是被关闭的。

有利就有弊,我们看下这个参数有什么影响:

  • 性能影响:因为要存储额外的信息,对 stack trace会有性能上面的压力。
  • 安全影响:从上面的例子我们可以看到异常信息中包含了非常充分的代码信息内容。如果对一些机密应用,完全可以通过异常信息来推断代码逻辑。从而对安全性造成影响。
  • 兼容性:最后是兼容性,之前的JVM可没有存储这些额外的NPE信息,所以可能会有兼容性的问题。

本文的例子:https://github.com/ddean2009/learn-java-base-9-to-20

到此这篇关于JDK14的新特性NullPointerExceptions的使用的文章就介绍到这了,更多相关JDK14 NullPointerExceptions内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java14发布了,再也不怕NullPointerException了

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPointerExceptions null何错之有? 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NullPointerException)的骚扰.相信很多程序员都特别害怕出现程序中出现NPE,因为这种异常往往伴随着代码的非预期运行. 在编程语言中,空引用(Null Refere

  • 在 Ubuntu Linux 上安装 Oracle Java 14的方法

    最近,Oracle 宣布 Java 14(或 Oracle JDK 14)公开可用.如果你想进行最新的实验或者开发的话,那么你可以试试在 Linux 系统上安装 Java 14. Oracle JDK 14(或简称 Java 14)发布版包含几个新功能,如果你想预览它们的话.我已添加了链接: instanceof 的模式匹配 Records Text Blocks 除预览功能外,它还包含一些改进和补充.在新闻中,他们还提到了其他改进: 此外,最新的 Java 版本增加了 Java 语言对 swi

  • Java 14 发布了,你还会使用Lombok?

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章(http://cr.openjdk.java.net/~briangoetz/amber/datum.html ),详尽的说明了并吐槽了Java语言,他和很多程序员一样抱怨"Java太啰嗦"或有太多的&q

  • 23种设计模式(14)java迭代器模式

    23种设计模式第十四篇:java迭代器模式 定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节. 类型:行为类模式 类图: 如果要问java中使用最多的一种模式,答案不是单例模式,也不是工厂模式,更不是策略模式,而是迭代器模式,先来看一段代码吧: public static void print(Collection coll){ Iterator it = coll.iterator(); while(it.hasNext()){ String str = (String

  • Java 版的 Ruby 解释器 JRuby 1.7.14 发布

    JRuby 1.7.14 发布 ,此版本现已提供下载: http://www.jruby.org/download JRuby 1.7 主要是为了兼容 Ruby 1.9.3 版本,改进记录如下: 解决了 30 个 issues 修复了 Jar 文件源潜在的内存泄漏问题 因为在 Rails 应用启动比较慢,所以默认禁用 invokedynamic load/require 内部重构和简化 解决了一些兼容性问题 1.7.14 修复的 bug: #1923 - String#start_with? r

  • Java微信公众平台开发(14) 微信web开发者工具使用

    为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信客户端的表现,使得开发者可以使用这个工具方便地在 PC 或者 Mac 上进行开发和调试工作.你可以: 使用自己的微信号来调试微信网页授权 调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出 使用基于 weinre 的移动调试功能 利用集成的 Chrome DevTools 协助开发 该工具界面主要由几大部分组成,如下图所示: 顶部菜单栏是刷新.后退.选

  • Eclipse IDE可支持Java 14編程

    随着JDK 14的发布(https://waylau.com/jdk-14-released/),各大Java IDE也开始支持JDK 14.最新版本的Eclipse IDE 2020-03也于2020年3月18日发布,本文介绍如何通过Eclipse IDE来开发Java 14应用. 下载 下载地址https://www.eclipse.org/downloads/packages/ 根据个人的需要,下载Java Developers或者Enterprise Java Developers版本.

  • JDK14的新特性NullPointerExceptions的使用

    JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptions简称NPE,它是运行时异常的一种,也是java程序中最最容易出现的异常. 出现了NullPointerExceptions之后我们怎么处理呢? 一般情况下就是看日志,看一下到底哪一行出错了.如果这一行只有简单的代码,那么很容易就找到问题所在. 要命的是如果这一行很复杂,那么找出问题就不是那么容易

  • Java中JDK14的新特性之JFR,JMC和JFR事件流(推荐)

    简介 Java Flight Recorder(JFR)是JVM的诊断和性能分析工具.它可以收集有关JVM以及在其上运行的Java应用程序的数据.JFR是集成到JVM中的,所以JFR对JVM的性能影响非常小,我们可以放心的使用它. 一般来说,在使用默认配置的时候,性能影响要小于1%. JFR的历史很久远了.早在Oracle2008年收购BEA的时候就有了.JFR一般和JMC(Java Mission Control)协同工作. JFR是一个基于事件的低开销的分析引擎,具有高性能的后端,可以以二进

  • JDK14的新特性:instanceof模式匹配的使用

    JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks仍然是预览特性. 本文要讲的就是JDK14的一个预览特性instanceof的pattern matching. 也就是说在instanceof中可以使用模式匹配了. 怎么理解呢? 我们先举个历史版本中使用instanceof的例子. 假如我们是动物园的管理员,动物园里面有Girraffe和Hippo两种动物. @Data public class

  • JDK14新特性之switch表达式的实现

    简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP 361: Switch Expressions (Standard). 其实Switch新增的功能有两个,一个就是可以连写case,一个就是switch可以带返回值了. 写在前面 就在我兴致勃勃的想要创建一个以switch命名的package的时候,突然间发现在IDEA中居然创建不java类了. 经过我的再三尝试,反复改名,终于被我发现了隐藏在里面的小秘密: java k

  • 简单了解Spring Framework5.0新特性

    SpringFramework5.0是自2013年12月版本4发布之后SpringFramework的第一个主发行版.SpringFramework项目的领导人JuergenHoeller于2016年7月28日宣布了第一个SpringFramework5.0里程碑版本(5.0M1). 现在,将近一年的时间过去以后,我们期盼已久的RC3版本将于2017年7月18日发行.这是路线图规划中SpringFramework5.0首个GA发行版的最后一次发行. 从高层来看,SpringFramework5.

  • JDK 14的新特性:文本块Text Blocks的使用

    说起来,Text Blocks是在JDK13中以第一次预览版本引入的.现在在JDK14中是第二次预览版本 JEP 368: Text Blocks. 在我们日常的工作中,有时候需要用到一大段的字符串,这些字符串需要换行,需要排版,需要转义.在一个文本编辑器中,这当然是非常容易的事情.但是在java代码中,就是一个噩梦了. 虽然IDE可以自动帮我们加上换行甚至可以对字符串进行拼接.但在java程序眼中,添加的诸多额外的代码破坏了代码的美感.是任何一个有洁癖的程序员都无法忍受的. 怎么办? Text

  • JDK13的新特性之AppCDS详解

    简介 AppCDS的全称是Application Class-Data Sharing.主要是用来在不同的JVM中共享Class-Data信息,从而提升应用程序的启动速度. 通常来说,如果要执行class字节码,JVM需要执行下面的一些步骤:给定一个类的名字,JVM需要从磁盘上面找到这个文件,加载,并验证字节码,最后将它加载进来. 如果JVM启动的时候需要加载成百上千个class,那么需要的就不是一个小数目了. 对于打包好的jar包来说,只要jar的内容不变,那么jar包中的类的数据始终是相同的

  • spring5新特性全面介绍

    前方:对于很多开发人员来说,目前大都还在使用spring4的时候,而spring5早已经发布.虽然你可能暂时还没有使用到spring5,但还是需要对其有个大概的了解. Spring 5 于 2017 年 9 月发布了通用版本 (GA),它标志着自 2013 年 12 月以来第一个主要 Spring Framework 版本.它提供了一些人们期待已久的改进,还采用了一种全新的编程范例,以反应式宣言中陈述的反应式原则为基础. 这个版本是很长时间以来最令人兴奋的 Spring Framework 版本

  • Vue.js 2.5新特性介绍(推荐)

    TypeScript TypeScript是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.2012年十月份,微软发布了首个公开版本的TypeScript,在2013年6月19日,微软发布了TypeScript 0.9的正式版本,到目前为止,TypeScript已发展到2.x版本 安装TypeScript 安装TypeScript主要有两种方式: 通过npm方式安装(Node.js包管理器) 安装TypeS

  • Java8新特性Stream流实例详解

    什么是Stream流? Stream流是数据渠道,用于操作数据源(集合.数组等)所生成的元素序列. Stream的优点:声明性,可复合,可并行.这三个特性使得stream操作更简洁,更灵活,更高效. Stream的操作有两个特点:可以多个操作链接起来运行,内部迭代. Stream可分为并行流与串行流,Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换.串行流就不必再细说了,并行流主要是为了为了适应目前多核机器的时代,提高系统CP

随机推荐