我知道在Scala中,一个方法应该永远不返回null
... 但是对于输入参数呢?考虑下面的代码片段...
object MyObject {
def myMethod(p: String): Option[String] = {
if (p == null) throw new IllegalArgumentException("p is null.")
...
}
}
这是我检查 p
是否正确的方式?有什么建议吗?
我知道在Scala中,一个方法应该永远不返回null
... 但是对于输入参数呢?考虑下面的代码片段...
object MyObject {
def myMethod(p: String): Option[String] = {
if (p == null) throw new IllegalArgumentException("p is null.")
...
}
}
这是我检查 p
是否正确的方式?有什么建议吗?
惯例是Scala代码不使用null(只有极少数的例外情况,当使用那些库函数时应立即修复)。
因此,Scala中的null表示出了问题(至少是PBCAK),因此您可以抛出异常。这不是常规操作;这是一些严重的错误。在捕获严重的错误时捕获异常。捕获IllegalArgumentException
而不是NullPointerException
不会添加任何额外信息。只需保留原始内容。
如果代码来自Java,则处理它的规范方法是将其包装在Option
中,这将将null
转换为None
。然后,您可能甚至不需要抛出异常;只需返回None
。
def myMethod(p: String) = Option(p).map(_.toLowerCase)
Option(p).orElse(throw new IllegalArgumentException("Null!"))
是表达抛出异常情绪的一种简洁方式。scala.util.Try(...)
中,它会自动捕获并打包异常。 如果您想要封装异常而不是抛出异常,则应该选择这种方法。(并使用Try
而不是Option
。)import scala.util.Try
def myMethod(p: String) = Try(p.toLowerCase)
Either
。 错误处理的约定是期望的输出为Right(whatever)
,而Left(whatever)
表示出现了问题。有多种方法,而你的方法只是其中之一。
您也可以使用以下方法:
require(p != null, "p is null.")
def myMethod(p: String): Option[String] = {
// no exception
for {
pp <- Option(p)
} yield p + " foo bar"
}
编辑:
或者如果你想在不抛出异常的情况下获取错误信息,可以使用 Either
:
def myMethod(p: String): Either[Exception, String] = {
if(p == null) Left(new IllegalArgumentException("p is null."))
else Right(p + "foo bar")
}
def square(x: String): String = math.pow(x.toInt, 2).toInt.toString
会变成一些尴尬的东西
def square(x: String): String =
if (x == null) throw new NullPointerException()
math.pow(x.toInt, 2).toInt.toString
}
或者
def square(x: String): String = Option(x) match {
case Some(x) => math.pow(x.toInt, 2).toInt.toString
case None => throw new NullPointerException()
}
太可怕了。
Double
是原始类型,它不能为null
。 - Rex Kerr我最喜欢的方法是这样的:
object HandlingInputValidation {
def main(args: Array[String]) = {
println("A1: " + handleInput("Correct ") + " END")
println("A2: " + handleInput("Correct") + " END")
println("A3: " + handleInput("") + " END")
println("A4: " + handleInput(" ") + " END")
println("A5: " + handleInput(null) + " END")
}
def handleInput(data: String): Option[String] = {
Option(data).map(_.trim.toLowerCase)
}
}
null
将会被翻译成 None
,并且空格将被删除。