3.10. Typ Null

Wyżej od typu Nothing w hierarchii typów znajduje się typ Null. Typ Null jest podtypem AnyRef i wszystkich innych typów będących podtypami AnyRef. Istnieje jedna możliwa wartość tego typu i jest nią null, która jest referencją do specjalnego obiektu. Obiekt null w następujący sposób implementuje metody klasy AnyRef.

Metody eq i == wywołane na obiekcie null zwracają wartość true, jeśli ich argumentem jest również null oraz zwracają false w przeciwnym przypadku. Metody ne i != zachowują się odwrotnie.

scala> val n: AnyRef = null
n: AnyRef = null

scala> n == null
res0: Boolean = true

scala> n == 1
res1: Boolean = false

scala> n eq null
res2: Boolean = true

scala> n ne null
res3: Boolean = false

scala> n != null
res4: Boolean = false

scala> n != 1
res5: Boolean = true

Metoda isInstanceOf[T] wywołana na obiekcie null zwraca wartość false.

scala> null.isInstanceOf[Int]
res6: Boolean = false

scala> null.isInstanceOf[String]
res7: Boolean = false

scala> null.isInstanceOf[Any]
res8: Boolean = false

Metoda asInstanceOf[T] powinna (według specyfikacji) zwracać null, jeśli typem T jest AnyRef lub jego podtyp, natomiast wyrzucać wyjątek NullPointerException w przeciwnym przypadku.

scala> null.asInstanceOf[Null]
res9: Null = null

scala> null.asInstanceOf[AnyRef]
res10: AnyRef = null

scala> null.asInstanceOf[String]
res11: String = null

scala> null.asInstanceOf[Any]
res12: Any = null

scala> null.asInstanceOf[Int] 
res13: Int = 0

scala> null.asInstanceOf[Nothing]
java.lang.NullPointerException
  at .$print$lzycompute(<console>:10)
  at .$print(<console>:6)
…

Niestety, metoda asInstanceOf[T] nie zawsze działa w prawidłowy sposób. Na przykład wynikiem wywołania tej metody w wierszu nie jest wyjątek, tylko wartość 0.

Odwołania do innych składowych obiektu null skutkują wyjątkiem NullPointerException.

scala> null.equals(1)
java.lang.NullPointerException
  ... 33 elided

scala> null.toString
java.lang.NullPointerException
  ... 33 elided

scala> null.hashCode
java.lang.NullPointerException
  ... 33 elided

Specyfikacja języka Scala opisuje obiekt null w punkcie 6.3.

Język programowania Scala Wydanie 2. Copyright © Grzegorz Balcerek 2016

Licencja Creative Commons

Ten utwór jest dostępny na licencji Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowe.

Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.