2010-12-08 7 views
2

このコード(Not a)Scalaコンパイラのバグ? (ヌル・ポインタ例外)

v(2,1) 
var m=Array[String]() 
def v(f:Int,t:Int)= 
{ var move= (10*f+t).toString 

    m :+ "21" 

} 

(Scalaのスクリプトとして実行)Mを実行するとき

がNULLポインタ例外を与える:+ "21" ライン。

この

var m=Array[String]() 
def v(f:Int,t:Int)= 
{ var move= (10*f+t).toString 

    m :+ "21" 

} 
v(2,1) 

作品。私は両方とも動作するはずだと思います。これはコンパイラのバグです。または私は間違っていますか?

スカラ座2.8.1、Windows XPの

答えて

9

あなたが間違っている:あなたはそれが初期化されている前に変数mにアクセスしようとしています。

mの行が「問題のある」行(例外がスローされた箇所)の前にあるという理由だけで、必ずしも最初に実行されるというわけではありません。

私は(あなたがそれを作成するのと同じ挙動を示す)は、このクラスを作った:

class OrderTest { 
    foo(1) 
    val l = List("one", "two") 
    def foo(i : Int) = println(l(i)) 
} 

そして-printオプションを指定してコンパイル:

class OrderTest extends java.lang.Object with ScalaObject { 
    private[this] val l: List = _; 
    <stable> <accessor> def l(): List = OrderTest.this.l; 
    def foo(i: Int): Unit = scala.this.Predef.println(OrderTest.this.l().apply(i)); 
    def this(): test.OrderTest = { 
    OrderTest.super.this(); 
    OrderTest.this.foo(1); 
    OrderTest.this.l = immutable.this.List.apply(scala.this.Predef.wrapRefArray(Array[java.lang.String]{"one", "two"}.$asInstanceOf[Array[java.lang.Object]]())); 
    () 
    } 
} 

あなたは非常にはっきりと見ることができます何が起こっている

+0

Facepal :)あなたはかなり正しいです。私は2パスのコンパイル段階を前提としていましたが、それはどのように動作するのかはもちろんありません。 –

+0

scalaコードが –

+0

に相当するものの完全な形式を与えるために編集された回答Paul:コンパイルは "2段階" vが定義された後に使用されるのを見てください。実際には、Javaをコンパイルするにも多くの段階が必要なので、私はあなたが何を持っているか分からない。 – Blaisorblade