I know in Scala a method should never return null
... but what's about input parameters? Given the following code snippet...
object MyObject {
def myMethod(p: String): Option[String] = {
if (p == null) throw new IllegalArgumentException("p is null.")
...
}
}
... is the way I check p
correct? Is there any recommendation?
The convention is that Scala code does not use nulls (with a tiny number of exceptions, which should immediately be fixed when using those library functions).
Thus, a null from Scala is a sign that something has gone wrong (at least a PBCAK), so you may as well throw an exception. This is not routine operation; this is something seriously screwed up. Catch the exception wherever you catch serious screw-ups. Catching an IllegalArgumentException
instead of a NullPointerException
adds no extra information. Just leave the original alone.
If the code comes from Java, the canonical way of dealing with it is to wrap it in Option
, which will convert null
to None
. Then you probably don't even need to throw an exception; just return a None
.
def myMethod(p: String) = Option(p).map(_.toLowerCase)
If you cannot continue when it is null, then you need to consider whether an informative exception would help. Option(p).orElse(throw new IllegalArgumentException("Null!"))
is one compact way of expressing the exception-throwing sentiment.
In Scala 2.10, you can also wrap things in scala.util.Try(...)
which will automatically catch and package the exception for you. If you want a packaged exception instead of a thrown one, this is the way to go. (And use Try
instead of Option
.)
import scala.util.Try
def myMethod(p: String) = Try(p.toLowerCase)
Finally, for more general handling of alternative outcomes, use Either
. The convention for error handling is that the expected output is a Right(whatever)
, while Left(whatever)
indicates that something went wrong.
There are several ways and your way is one.
You could also use:
require(p != null, "p is null.")
or the "more functional" way would be to use Option
:
def myMethod(p: String): Option[String] = {
// no exception
for {
pp <- Option(p)
} yield p + " foo bar"
}
edit:
or if you want the error without an exception thrown you can use Either
:
def myMethod(p: String): Either[Exception, String] = {
if(p == null) Left(new IllegalArgumentException("p is null."))
else Right(p + "foo bar")
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With