b = null // 编译通过
看到这个?的时候,是不是发现和Groovy有点像?不过还是有一定区别的,这里就不展开了。
好了,书归正传,我们来看看作为一个TOIBE编程语言排行榜第一名的语言,Java语言对于NPE做出了哪些努力!
Java做了哪些努力
一直以来对于null和NPE的改进还是做出了一些努力的。
首先在Java 8中提供了Optional,其实在Java 8 推出之前,Google的Guava库中就率先提供过Optional接口来使null快速失败。
Optional在可能为null的对象上做了一层封装,Optional对象包含了一些方法来显式地处理某个值是存在还是缺失,Optional类强制你思考值不存在的情况,这样就能避免潜在的空指针异常。
但是设计Optional类的目的并不是完全取代null,它的目的是设计更易理解的API。通过Optional,可以从方法签名就知道这个函数有可能返回一个缺失的值,这样强制你处理这些缺失值的情况。
关于Optional的用法,不是本文的重点,就不在这里详细介绍了,笔者在日常开发中经常结合Stream一起使用Optional,还是比较好用的。
另外一个值得一提的就是最近(2020年03月17日)发布的JDK 14中对于NPE有了一个增强。那就是JEP 358: Helpful NullPointerExceptions
更有帮助的NPE
JDK 14中对于NEP有了一个增强,既然NPE暂时无法避免,那么就让他对开发者更有帮助一些。

每个Java开发人员都遇到过NullPointerExceptions (NPEs)。由于NPEs可以发生在程序的几乎任何地方,试图捕获并从它们中恢复通常是不切实际的。因此,开发人员通常依赖于JVM来确定NPE实际发生时的来源。例如,假设在这段代码中出现了一个NPE:
a.i = 99;
JVM将打印出导致NPE的方法、文件名和行号:
Exception in thread “main” java.lang.NullPointerException
at Prog.main(Prog.java:5)
通过以上堆栈信息,开发人员可以定位到a.i= 99这一行,并推断出a一定是null。
但是,对于更复杂的代码,如果不使用调试器,就不可能确定哪个变量是null。假设在这段代码中出现了一个NPE:
a.b.c.i = 99;
我们根本无法确定到底是a还是b或者是c在运行时是个null值。
但是,在JDK14以后,这种窘境就有解了。
在JDK14中,当运行期,试图对一个bull对象进行应用时,JVM依然会抛出一个NullPointerException (NPE),除此之外,还会通过通过分析程序的字节码指令,JVM将精确地确定哪个变量是null,并且在堆栈信息中明确的提示出来。
在JDK 14中,如果上文中的a.i = 99发生NPE,将会打印如下堆栈:
Exception in thread “main” java.lang.NullPointerException:
Cannot assign field “i” because “a” is null
at Prog.main(Prog.java:5)
如果是a.b.c.i = 99;中的b为null导致了空指针,则会打印以下堆栈信息:
Exception in thread “main” java.lang.NullPointerException:
Cannot read field “c” because “a.b” is null
at Prog.main(Prog.java:5)
可见,堆栈中明确指出了到底是哪个对象为null而导致了NPE,这样,一旦应用中发生NPE,开发者可以通过堆栈信息第一时间定位到到底是代码中的那个对象为null导致的。
这算是JDK的一个小小的改进,但是这个改进对于开发者来说确实是非常友好的。真的希望这些小而美的改动可以在JDK中越来越多。
欢迎关注公众号:《老男孩的成长之路》,后台私信“资料”领取《Java面试宝典Plus》版
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>
针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
识点等等的xmind手绘图~
[外链图片转存中…(img-2BtbG709-1714320618388)]
[外链图片转存中…(img-qm4F2df9-1714320618388)]