12

私はScalaでメソッドが決して返さないことを知ってnullいます...しかし入力パラメーターはどうですか?次のコードスニペットが与えられます...

object MyObject {

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

...私がチェックする方法はp正しいですか?何かお勧めはありますか?

4

4 に答える 4

23

慣習として、Scala コードは null を使用しません (少数の例外がありますが、これらのライブラリ関数を使用する場合はすぐに修正する必要があります)。

したがって、Scala からの null は、何かがうまくいかなかったこと (少なくともPBCAK ) の兆候であるため、例外をスローすることもできます。これは日常的な操作ではありません。これは深刻な問題です。深刻な失敗をキャッチするたびに、例外をキャッチします。IllegalArgumentExceptiona の代わりにan をキャッチしても、NullPointerException追加情報は追加されません。オリジナルはそのままにしておきます。

Optionコードが Java からのものである場合、それを処理する標準的な方法は、 に変換nullされるでラップすることNoneです。そうすれば、おそらく例外をスローする必要さえありません。を返すだけNoneです。

def myMethod(p: String) = Option(p).map(_.toLowerCase)

null のときに続行できない場合は、有益な例外が役立つかどうかを検討する必要があります。 Option(p).orElse(throw new IllegalArgumentException("Null!"))は、例外をスローする感情を表現する 1 つのコンパクトな方法です。

Scala 2.10 ではscala.util.Try(...)、例外を自動的にキャッチしてパッケージ化するものをラップすることもできます。スローされた例外ではなく、パッケージ化された例外が必要な場合は、これが適しています。(そしてTryの代わりに使用しOptionます。)

import scala.util.Try
def myMethod(p: String) = Try(p.toLowerCase)

最後に、代替結果をより一般的に処理するには、 を使用しますEither。エラー処理の規則では、予想される出力は でありRight(whatever)、 whileLeft(whatever)は何か問題が発生したことを示します。

于 2012-11-29T22:49:28.257 に答える
6

いくつかの方法があり、あなたの方法は 1 つです。

以下を使用することもできます。

require(p != null, "p is null.")

または「より機能的な」方法は、次を使用することOptionです:

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")
}
于 2012-11-29T22:07:11.350 に答える
0

Scala のイディオムは、基本的に「null 値を使用しない」です。したがって、不潔な Java ユーザーに対応する必要のある API を作成しているのでない限り、私はそれについて心配する必要はありません。そうしないと、作成するすべてのメソッドのすべてのパラメーターに対して、このボイラープレート チェックを挿入することになります。

あなたの美しい一行メソッド

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()
}

なんて恐ろしい。

于 2012-11-29T22:29:15.770 に答える