如何在Scala中处理空输入参数

j3d*_*j3d 12 scala

我知道在Scala中一个方法永远不会返回null...但是输入参数是什么?给出以下代码片段...

object MyObject {

    def myMethod(p: String): Option[String] = {
        if (p == null) throw new IllegalArgumentException("p is null.")
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

......我检查的方式是否p正确?有什么建议吗?

Rex*_*err 23

惯例是Scala代码不使用空值(具有少量异常,在使用这些库函数时应立即修复).

因此,来自Scala的null表示出现了问题(至少是PBCAK),因此您也可以抛出异常.这不是常规操作; 这是严重搞砸的事情.无论何时遇到严重的搞砸,都要抓住例外.捕获IllegalArgumentException而不是NullPointerException添加没有额外信息.只留下原来一个人.

如果代码来自Java,处理它的规范方法是将其包装Option,将转换nullNone.那你甚至可能不需要抛出异常; 回来一个None.

def myMethod(p: String) = Option(p).map(_.toLowerCase)
Run Code Online (Sandbox Code Playgroud)

如果在null为null时无法继续,则需要考虑信息性异常是否有用. Option(p).orElse(throw new IllegalArgumentException("Null!"))是一种表达异常投掷情绪的紧凑方式.

在Scala 2.10中,您还可以包装scala.util.Try(...)自动捕获和打包异常的内容.如果你想要一个打包的异常而不是一个抛出的异常,这就是你要走的路.(而Try不是使用Option.)

import scala.util.Try
def myMethod(p: String) = Try(p.toLowerCase)
Run Code Online (Sandbox Code Playgroud)

最后,对于替代结果的更一般处理,请使用Either.错误处理的约定是预期的输出是a Right(whatever),同时Left(whatever)表明出现了问题.


dre*_*xin 6

有几种方式,你的方式就是一种.

你也可以使用:

require(p != null, "p is null.")
Run Code Online (Sandbox Code Playgroud)

或者"更实用"的方式是使用Option:

def myMethod(p: String): Option[String] = {

  // no exception
  for {
    pp <- Option(p)
  } yield p + " foo bar"
}
Run Code Online (Sandbox Code Playgroud)

编辑:

或者如果你想要没有抛出异常的错误,你可以使用Either:

def myMethod(p: String): Either[Exception, String] = {
  if(p == null) Left(new IllegalArgumentException("p is null."))
  else Right(p + "foo bar")
}
Run Code Online (Sandbox Code Playgroud)

  • 但这引出了一个问题; 为什么不只是有一个方法接受Option [String]? (2认同)