此代码
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
答案 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]]()));
()
}
}
你可以清楚地看到发生了什么