Mam dziwny błąd. Jeden z obiektów sprawy (tylko jeden) dostaje null
jako wartość i oczywiście powoduje wyjątki wskaźnika Null w dalszej części życia. Ale dlaczego?Obiekt sprawy zostaje zainicjalizowany na wartość null - jak to możliwe?
Próbowałem różnych rzeczy (zmieniając nazwy obiektów, zmieniając wahanie, nawet przepisując tę samą linię dwukrotnie, otrzymując jeden z nich do kompilacji ładnie, a inny daje null
). Sklonowałem repozytorium, aby upewnić się, że nie jest to zabawny efekt przechodniów. Zarówno Scala 2.11.4, jak i 2.11.5 powodują to samo.
Kod jest raczej pokrętny i odcięcie go od kontekstu nie ma większego sensu. Ale tu jest, na wypadek, gdyby dzwoniło na kogoś innego.
sealed trait A {}
sealed trait B extends A {}
sealed trait C { val n: Int }
object C {
val C1: C = new C { val n = 1 }
val C2: C = new C { val n = 2 }
val C3: C = new C { val n = 3 }
val C4a: C = new C { val n = 4 }
val C4b: C = new C { val n = 5 }
}
class D (depends: Seq[C], f: (Seq[Double]) => Double) {
// ...methods removed
}
sealed trait E { val e: Int = 1 }
object D {
import C._
private def f(v: Seq[Double]): Double = 0
private def list(acc: Boolean) = List(
C1, C2, C3,
if (acc) C4a else C4b
)
case object D1 extends D(list(true), f) with E // <-- this gets to be 'null'!!
case object D2 extends D(list(false), f)
val keys: Seq[D] = List(D1, D2)
println(s"D1: $D1")
println(s"D2: $D2")
assert(D1 != null) // <-- caught here
assert(D2 != null)
}
Próbowałem zachować jak najwięcej szczegółów w kodzie, na ile to możliwe, na wypadek, gdyby w jakiś sposób były ważne.
Co to może być?
Oznaczałem to jako "heisenbug", ale kiedy kompiluję rzeczy, jest to zgodne (tzn. Kolejne testy zawsze dawały taki sam efekt).
EDYCJA: Pierwotnie powiedziałem, że to się stało tylko z sbt test
(i nie sbt run
), ale to nie jest prawda. Oba zostały w równym stopniu dotknięte.
EDYCJA: Wydaje się, że @dk14 złożył to jako Scala issue 9115. Dzięki!
Ten kod nie może zostać wykonany. Czy można utworzyć przykład wykonywalny, który powoduje nieoczekiwane zachowanie? – sschaef
Próbowałem tego, ale zredukowana próbka działała zgodnie z przeznaczeniem (tj. Bez wartości null). Większy projekt, który ma problem, jest zastrzeżony, więc nie mogę ujawnić więcej. – akauppi