如何在Scala中处理`null`

时间:2015-04-13 19:50:19

标签: scala scala-option

当Scala app与Java代码交互时,有时需要处理Java方法返回的null

这两种方式中哪一种更加scala惯用?我应该使用哪一个?

1

val a = javaClass.javaMethod
if (a == null) 
  throw new IllegalArgumentException("Wrong param")
processA(a)

2

val a = Option(javaClass.javaMethod)
processA(a.getOrElse(throw new IllegalArgumentException("Wrong param")))

2 个答案:

答案 0 :(得分:3)

如果延迟决定对null做什么是有利的,那么你应该使用Option形式,因为它迫使你以后处理它(即你不能忘记)。

否则,如果您要抛出异常,您应该尽可能快地执行此操作,而不会引入任何多余的变量。如果你打算写if,使用a语句是一个很好的方法。如果没有,您可能想要编写辅助扩展方法:

implicit class ThrowExceptionOnNull[A](private val underlying: A) extends AnyVal {
  def throwIfNull(msg: String = "Wrong param") = {
    if (underlying == null) throw new IllegalArgumentException(s)
    underlying
  }
}

然后您的代码甚至不需要临时a变量:

processA(javaClass.javaMethod.throwIfNull)

并且方法名称对于正在阅读代码的人来说是一个非常好的警告,如果它为空则会发生什么。

Option(javaClass.javaMethod).get也会抛出异常而内置,但它不够优雅。这不是Option应该是什么,所以你最好自己编写自己的方法。

答案 1 :(得分:0)

我更喜欢第一种解决方案,它比第二种解决方案更清晰。

它可以改进为Scala成语:

require(a != null, "Wrong param")
在这种情况下,

Option不合适,因为Option通常是在返回值中设计的。例如,List.find(...): Option