2013-04-09 71 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