2010-12-08 2 views
2

Этого код(Не a) Ошибка компилятора Scala? (Исключение нулевого указателя)

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

    m :+ "21" 

} 

(запустить его в качестве сценария лестницы)

дает исключение нулевого указателя при выполнении м: + строка «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

ответ

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

Facepalm :) Вы совершенно правы. Я предположил двухпроходную фазу компиляции, и, конечно же, это не так, как она работает – 2010-12-08 10:33:45

Смежные вопросы