(Не а) ошибка компилятора Scala? (исключение нулевого указателя) - PullRequest
2 голосов
/ 08 декабря 2010

Этот код

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 Ответ

9 голосов
/ 08 декабря 2010

Вы ошибаетесь: вы пытаетесь получить доступ к переменной 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]]()));
    ()
  }
}

Вы можете очень ясно видеть, что происходит

...