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

时间:2016-10-31 08:20:19

标签: scala scala-collections

我是scala的新手。请帮我理解下面的代码片段

null.==("goutam") // ---> return false
null.equals("goutam") // ---> throw NullPointerException

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

1 个答案:

答案 0 :(得分:7)

  

为什么第一个语句不会抛出,但第二个语句不会抛出

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

  

6.3空值

     

null值的类型为scala.Null,因此   与每种参考类型兼容。它表示参考值   它指的是一个特殊的“null”对象。该对象实现   类scala.AnyRef中的方法如下:

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

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

equalsAnyRef上定义,并且根据定义不会处理null值。可以使用eq来检查引用相等性(通常不是您想要做的事情):

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

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

==可以正确处理null,这就是您应该使用的内容。有关详情,请参阅Whats the difference between == and .equals in Scala?