Why first statement does not throw but second one does
Per the language specification (6.3), there are specific methods on null
which will not cause a NullReferenceException
to occur if invoked. They're defined as:
6.3 The Null Value
The null
value is of type scala.Null
, and is thus
compatible with every reference type. It denotes a reference value
which refers to a special “null” object. This object implements
methods in class scala.AnyRef
as follows:
eq(x)
and ==(x)
return true iff the argument x is also the "null"
object.
ne(x)
and !=(x)
return true iff the argument x is not also the
"null" object.
isInstanceOf[T]
always returns false.
asInstanceOf[T]
returns the default value of type T.
##
returns 0.
A reference to any other member of the "null" object causes a NullPointerException to be thrown.
equals
is defined on AnyRef
and doesn't handle null
values as per definition. eq
, which checks for reference equality (that's usually not what you want to do) can be used:
scala> null.==("goutam")
res0: Boolean = false
scala> null.eq("goutam")
res1: Boolean = false
==
does handle null
properly, and that is what you should be using. More on that in Whats the difference between == and .equals in Scala?