¿Por qué el siguiente código de Scala arroja una NullPointerException?

Si creo una instancia de Base2, funciona bien

class Base2 {

  class Benchmark {
    def onTrade() {
      println("base onTrade")
    }
  }

  protected val benchmark = new Benchmark
  benchmark.onTrade
}

class Base3 extends Base2 {

  override val benchmark = new Benchmark {
    override def onTrade() {
      println("sub onTrade")
    }
  }
}

// to run
new Base3

Información de excepción:

java.lang.NullPointerException
    at Base2.<init>(<console>:16)
    at Base3.<init>(<console>:19)
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
...

preguntado el 27 de agosto de 11 a las 22:08

No anule los valores de hormigón. De esa manera se encuentra la locura (o, más concretamente, el software que no funciona). -

2 Respuestas

Base2 es inicializado primero a qué hora benchmark.onTrade se ejecuta, sin embargo, el miembro benchmark de Base3 (¡no Base2!) se está utilizando debido a la anulación (benchmark en Base2 se inicializa primero, pero no importa porque el otro benchmark está siendo "ligado" a!). Estoy bastante seguro de que esto tiene que ver con que val sea virtual...

La inicialización de Base3 no comenzará (¿o se reanudará?) Hasta después de que Base2 haya terminado y, por lo tanto, Base3.benchmark sigue siendo nulo en benchmark.onTrade.

FWIW, un "vago val" parece "solucionar" el problema.

Feliz codificación.

Respondido 28 ago 11, 02:08

No sé Scala, pero podría ser algo como:

Base3's benchmark instancia no se construye hasta después de todo el código en Base2 (benchmark.onTrade) ¿ha sido ejecutado?

Respondido 28 ago 11, 02:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.