2013-04-09 81 views
2

我在scala编译器中遇到以下错误。我在吉拉找不到这个问题。因此,我决定先问清楚,如果这是一个已知的问题:懒惰val的scala编译器错误

我开始用以下两种方法:

def getName: String = getString match { 
    case None => return "" 
    case Some(str) => return str 
    } 

    def getString: Option[String] = Some("abc") 

然后,我改变了第一种方法

lazy val getName: String = getString match { 
    case None => return "" 
    case Some(str) => return str 
    } 

不幸的是,我忘了删除返回语句。在这种情况下,Scala编译器应为邮件“的方法定义之外的回报”停下来,但它确实是:

[ant:scalac] error: uncaught exception during compilation: java.lang.NullPointerException 

[ant:scalac] java.lang.NullPointerException 
[ant:scalac] at scala.reflect.internal.Trees$class.Select(Trees.scala:1066) 
[ant:scalac] at scala.reflect.internal.SymbolTable.Select(SymbolTable.scala:13) 

它看起来像一个错误。不是吗?

+0

你使用哪个Scala版本?你能否提供一个可编辑的例子来产生错误? – sschaef 2013-04-09 11:02:30

+0

我的Scala版本是2.10.1。这里的例子是[链接](https://github.com/macjankowski/scalatests.git) – rarry 2013-04-09 11:46:14

+0

好的,这是一个错误。只需在https://issues.scala-lang.org/secure/Dashboard.jspa – sschaef 2013-04-09 12:41:37

回答

0

这绝对是一个错误,因为编译器永远不会崩溃,而是发出编译错误。 现在,你的代码也不正确。在用于初始化val的表达式的上下文中有一个return语句。在这种情况下,没有什么可以返回(return表示从封闭方法返回,但这里没有封闭方法)。 你想要的是:

lazy val getName: String = getString match { 
    case None => "" 
    case Some(str) => str 
} 
+0

是,这正是我的意思。返回声明是故意的。否则,NPE不会出现。 – rarry 2013-04-09 12:31:39