实际上我在html解析器中使用我的代码。但在这里我重写了它以进行测试。
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
循环,则可以:
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 }
}
但我仍然对第一种情况感到困惑。
答案 0 :(得分:4)
这似乎是因为你要返回整个try
块的结果。如果您在块内移动return
,那很好:
try { return lines(4).replaceAll("[^0-9]", "").toInt } catch { case _ => return 0 }
它看起来像是在try
循环内返回for
块的编译器错误。请注意,这很好用:
def parse: Int = {
return try { 1 } catch { case _ => 0 }
0
}
虽然失败了:
def parse: Int = {
for (x <- List(1))
return try { 1 } catch { case _ => 0 }
0
}