2012-01-17 22 views
1

実際に私はHTMLパーサで自分のコードを使用しています。しかしここで私はテストのためにそれを書き直します。Scala - 単純な関数を持つVerifyError

def parse: Int = { 
    var texts = Array("a.b.c.d.1321,123.f") 
    for (text <- texts) { 
    var lines = text.split("\\.") 
    return try { lines(4).replaceAll("[^0-9]", "").toInt } catch { case _ => 0 } 
    } 
    0 
} 

コールparse、私はこの例外を得た:

java.lang.VerifyError: (class: $anonfun$parse$1, method: apply signature: (Ljava/lang/String;)Lscala/runtime/Nothing$;) Inconsistent stack height 0 != 3 
     at .parse(<console>:10) 
     at .<init>(<console>:10) 
     at .<clinit>(<console>) 
     at .<init>(<console>:11) 
     at .<clinit>(<console>) 
     at $print(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:704) 
     at scala.tools.nsc.interpreter.IMain$Request$$anonfun$14.apply(IMain.scala:920) 
     at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43) 
     at scala.tools.nsc.io.package$$anon$2.run(package.scala:25) 
     at java.lang.Thread.run(Thread.java:722) 

私の質問は、なぜコードがその例外を発生させないのか?

編集

だけ例外に焦点を当て、コーディングスタイルについては言及しないでください。コードを正常にコンパイルできるためです。

編集

変更結果の少し:

def parse: Int = { 
    var texts = Array("a.b.c.d.1321,123.f") 
    for (text <- texts) { 
    var lines = text.split("\\.") 
    return try { lines(4).replaceAll("[^0-9]", "").toInt } catch { case _ => -1 } 
    } 
    0 
} 

私はforループを使用しない場合、それはokです:

def parse: Int = { 
    var text = "a.b.c.d.1321,123.f" 
    var lines = text.split("\\.") 
    return try { lines(4).replaceAll("[^0-9]", "").toInt } catch { case _ => -1 } 
} 

しかし、私はまだです最初のケースについては混乱しています。

答えて

4

tryブロック全体の結果が返ってきているようです。あなたがブロック内でごreturnを移動した場合、それは大丈夫です:

try { return lines(4).replaceAll("[^0-9]", "").toInt } catch { case _ => return 0 } 

それはforループ内tryブロックを返却に関連するコンパイラのバグのように見えます。これが正常に動作していることに注意してください:

def parse: Int = { 
    return try { 1 } catch { case _ => 0 } 
    0 
} 

これが失敗している間:

def parse: Int = { 
    for (x <- List(1)) 
    return try { 1 } catch { case _ => 0 } 
    0 
} 
+0

おかげでDHG、私はそれを得ました。私はここにバグを報告しました:https://issues.scala-lang.org/browse/SI-5380 –

関連する問題