The use of null values is strongly discouraged, unless interacting with legacy Java code that expects null. Instead, Option should be used when the result of a function might either be something (Some) or nothing (None).
A try-catch block is more appropriate for error-handling, but if the function might legitimately return nothing, Option is appropriate to use, and simple.
An Option[T] can either be Some(value) (contains a value of type T) or None:
def findPerson(name: String): Option[Person]
If no person is found, None can be returned. Otherwise, an object of type Some containing a Person object is returned. What follows are ways to handle an object of type Option.
findPerson(personName) match {
case Some(person) => println(person.surname)
case None => println(s"No person found with name $personName")
}
val name = findPerson(personName).map(_.firstName).getOrElse("Unknown")
println(name) // Prints either the name of the found person or "Unknown"
val name = findPerson(personName).fold("Unknown")(_.firstName)
// equivalent to the map getOrElse example above.
If you need to convert an Option type to a null-able Java type for interoperability:
val s: Option[String] = Option("hello")
s.orNull // "hello": String
s.getOrElse(null) // "hello": String
val n: Option[Int] = Option(42)
n.orNull // compilation failure (Cannot prove that Null <:< Int.)
n.getOrElse(null) // 42