(不是)Scala编译器错误?(空指针异常)

The*_*aul 2 scala nullpointerexception scala-2.8

这段代码

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

    m :+ "21"

}
Run Code Online (Sandbox Code Playgroud)

(将其作为scala脚本运行)

执行m:+"21"行时给出空指针异常.

这个

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

    m :+ "21"

}
v(2,1)  
Run Code Online (Sandbox Code Playgroud)

作品.我认为两者都应该工作,这是一个编译器错误.还是我弄错了?

Scala 2.8.1,Windows XP

oxb*_*kes 9

你错了:你试图在变量m初始化之前访问它.

请注意,仅仅因为其上的行在m"有问题"行之前(即抛出异常的地方)并不一定意味着它首先运行.

我创建了这个类(在创建它时表现出相同的行为):

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

然后用-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]]()));
    ()
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以很清楚地看到发生了什么