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

时间:2010-12-08 10:30:17

标签: scala scala-2.8 nullpointerexception

此代码

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

    m :+ "21"

}

(以scala脚本运行)

在执行m:+“21”行时给出空指针异常。

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

    m :+ "21"

}
v(2,1)  

的工作原理。我认为两者都应该工作,这是一个编译器错误。或者我错了?

Scala 2.8.1,Windows XP

1 个答案:

答案 0 :(得分: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]]()));
    ()
  }
}

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