2017-04-13 12 views
1

私はエラーを取得しました。scala.MatchError:<SomeStringvalue>(クラスjava.lang.Stringの)

Exception in thread "main" scala.MatchError: SomeStringValue (of class java.lang.String) 

私はそれが原因で「SomeStringValue」の原因となったことがわかっは、のいずれかに存在していませんでしたケース:

val test = "SomeStringValue" 
test match { 
    case "Name" => println("Name") 
    case "Age" => println("Age") 
    case "Sex" => println("Sex") 
} 

私はelse caseを追加しました:_以下のように正しく実行されました。

val test = "SomeStringValue" 
test match { 
    case "Name" => println("Name") 
    case "Age" => println("Age") 
    case "Sex" => println("Sex") 
    case _  => println("Nothing Matched!!") 
} 

質問:Scalaのcase構造に常に一致する値を設定する必要がある理由は何ですか?

答えて

4

match構築物は、それ自身の発現である。今

val test = "SomeStringValue" 
val count: Int = test match { 
    case "Name" => 1 
    case "Age" => 2 
    case "Sex" => 3 
} 

countどのような値を次のようになります。

と仮定、代わりにprintln文を有するので、あなたが整数を持っていた、そして全体のブロックは、タイプIntegerの値でしょうか?だから、matchステートメントはすべての可能なケースを処理する必要があります。

パターンマッチング(sealed traitまたはsealed abstract classなど)がある場合など、コンパイラは警告を表示できますが、ほとんどの場合、実行時にエラーがスローされるため、実際に実行する必要がありますそれには注意してください。

+0

nullにできませんか? –

+0

この特殊なケースでは、 'Int'sはオブジェクトではないので、できません。しかし、より一般的には、関数型プログラミングの外でコンストラクトを使用することに同意するならば、後で未定義の 'NullPointerException'を与える' null'ではなく、特定の 'MatchError'例外を持つ方がはるかに有用ではありませんか?なぜなら、 'null'にならないもう一つの理由は、' null'は終了していない値ではなく、初期化されていない値です。 –

関連する問題