Java14发布了,再也不怕NullPointerException了

  

2020年3月17日发布,Java正式发布了JDK 14日目前已经可以开放下载。在JDK 14中,共16个有新特性,本文主要来介绍其中的一个特性:中358:有用的nullpointerexception

  

  

对于Java程序员来说,零是令人头痛的东西。时常会受到空指针异常(NullPointerException)的骚扰。相信很多程序员都特别害怕出现程序中出现肺水肿,因为这种异常往往伴随着代码的非预期运行。

  

在编程语言中,空引用(空引用)是一个与空指针类似的概念,是一个已宣告但其并未引用到一个有效对象的变量。

  1

在Java中就包含了零引了用和肺水肿了,但是其实,零引用是伟大的计算机科学家Tony Hoare早在1965年发明的,最初作为编程语言算法W的一部分。

  

1965年,英国一位名为Tony Hoare的计算机科学家在设计算法W语言时提出了零引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择空引用这种方式,“只是因为这种方法实现起来非常容易”。虽然他的设计初衷就是要“通过编译器的自动检测机制,确保所有使用引用的地方都是绝对安全的”,他还是决定为零引用开个绿灯,因为他认为这是为“不存在的值“建模最容易的方式。

  

但是在2009年,很多年后,他开始为自己曾经做过这样的决定而后悔不已,把它称为“一个价值十亿美元的错误”。实际上,霍尔的这段话低估了过去五十年来数百万程序员为修复空引用所耗费的代价。因为在算法W之后出现的大多数现代程序设计语言,包括Java,都采用了同样的设计方式,其原因是为了与更老的语言保持兼容,或者就像霍尔曾经陈述的那样,“仅仅是因为这样实现起来更加容易”。

  

 Java14发布了,再也不怕NullPointerException了

  

相信很多Java程序员都一样对零和肺水肿深恶痛绝,因为他确实会带来各种各样的问题(来自《Java 8实战》)。如:

  
      <李>它是错误之源。NullPointerException是目前Java程序开发中最典型的异常。它会使你的代码膨胀。   <李>它让你的代码充斥着深度嵌套的零检查,代码的可读性糟糕透顶。   <李>它自身是毫无意义的。空自身没有任何的语义,尤其是是它代表的是在静态类型语言中以一种错误的方式对缺失变量值的建模。   <李>它破坏了Java的哲学。Java一直试图避免让程序员意识到指针的存在,唯一的例外是:零指针。   <李>它在Java的类型系统上开了个口子。零并不属于任何类型,这意味着它可以被赋值给任意引用类型的变量。这会导致问题,原因是当这个变量被传递到系统中的另一个部分后,你将无法获知这个空变量最初赋值到底是什么类型。   
  

  

我们知道,出了Java语言外,还有很多其他的面向对象语言,那么在其他的一些语言中,是如何解决肺水肿的问题的呢?

  

如在Groovy中使用安全导航操作符(安全导航操作符)可以访问可能为零的变量:

        def carInsuranceName=简历及# 63;.car& # 63; .insurance& # 63; . name      

Groovy的安全导航操作符能够避免在访问这些可能零引为用的变量时发生NullPointerException,在调用链中的变量遭遇空时将空引用沿着调用链传递下去,返回一个null。

  

其实这个功能曾经考虑过增加一个类似的功能,但是后来又被舍弃了。

  

另外,在Haskell和Scala也有类似的替代品,如Haskell中可能的类型,Scala中[T]的选项。

  

在芬兰湾的科特林中,其类型系统严格区分一个引用可以容纳空还是不能容纳。也就是说,一个变量是否可空必须显示声明,对于可空变量,在访问其成员时必须做空处理,否则无法编译通过:

        var:字符串=癮bc”=null//编译错误   之前      

果允许为空,可以声明一个可空字符串,写作字符串# 63;:

        var b:字符串# 63;=癮bc”//字符串# 63;表示该字符串类型变量可为空   b=null//编译通过   之前      

看到这个?的时候,是不是发现和Groovy有点像?不过还是有一定区别的,这里就不展开了。

  

好了,书归正传,我们来看看作为一个TOIBE编程语言排行榜第一名的语言,爪哇语言对于神经性肺水肿做出了哪些努力!

  

  

一直以来对于零和肺水肿的改进还是做出了一些努力的。

Java14发布了,再也不怕NullPointerException了