null.==(obj)不会在scala中抛出空指针异常

Gou*_*ury 4 scala scala-collections

我是斯卡拉的新手.请帮我理解下面的代码片段

null.==("goutam") // ---> return false
null.equals("goutam") // ---> throw NullPointerException
Run Code Online (Sandbox Code Playgroud)

根据我的理解,null是Null特征的唯一实例,它扩展了Anyref和==,并且两者都是AnyRef的函数.那么为什么第一个声明不会抛出而第二个声明呢?

Yuv*_*kov 7

为什么第一个声明不会抛出但第二个声明不抛出

根据语言规范(6.3),有一些特定的方法,如果被调用,null它们不会导致NullReferenceException发生.它们被定义为:

6.3空值

null值的类型的scala.Null,并且因此与每个引用类型兼容.它表示引用特殊"空"对象的引用值.该对象在类scala.AnyRef中实现如下方法:

  • eq(x)==(x)如果参数x也是"null"对象,则返回true.
  • ne(x)!=(x)如果参数x不是"null"对象,则返回true.
  • isInstanceOf[T] 总是返回false.
  • asInstanceOf[T] 返回类型T的默认值.
  • ## 返回0.

对"null"对象的任何其他成员的引用会导致抛出NullPointerException.

equals是根据定义定义AnyRef并且不处理null值.eq,可以使用它来检查引用相等性(通常不是你想要做的):

scala> null.==("goutam")
res0: Boolean = false

scala> null.eq("goutam")
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

==确实处理null得当,这就是你应该使用的.更多关于什么是Scala中==和.equals之间的区别?