Scala - java.lang.VerifyError с простой функцией - PullRequest
1 голос
/ 17 января 2012

На самом деле я использую мой код в 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 }
}

Но я все еще не понимаю первый случай.

1 Ответ

4 голосов
/ 17 января 2012

Похоже, что вы возвращаете результат всего блока 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
}
...