Constructor de objects y Delegates.notNull

object WalletConfig { init { fill(HashMap<String, String>()) } var clientUrl: String by Delegates.notNull() private set fun fill(settingMap: Map<String, String>) { try { clientUrl = settingMap["URL_CLIENT"] ?: "" } catch(ex:Exception) { } } } 

throw ex: fill: carga el file de configuration 'wallet.config': java.lang.NullPointerException en ru.WalletConfig.setClientUrl (WalletConfig.kt)

El problema está causado por el bloque init y el inicializador de propiedad init orderados. Como se indica en la respuesta sobre la semántica de initialization de class . El bloque de init no es el constructor; su código está incluido en el constructor primario.

El siguiente ejemplo:

 class OrderOfInits { constructor() { println("constructor") } init { println("A") } init { println("B") } init { println("C") } } val a = OrderOfInits() 

Imprimiría:

 A B C constructor 

La initialization de delegates de propiedad también es parte del constructor primario. Su order de initialization en constructor refleja el order en el que fueron declarados. En otras palabras, el bloque de initialization init { fill(...) } invoca el setter clientUrl que a su vez intenta llamar al método de instancia Delegates.notNull() . Sin embargo, el campo de instancia que contiene Delegates.notNull() aún no se ha establecido, por lo tanto, NPE.

Para solucionar el problema, solo necesita reorderarlos de la siguiente manera:

 object WalletConfig { var clientUrl: String by Delegates.notNull() private set init { fill(HashMap<String, String>()) } ... } 
  • Los types de plataforma de llamada de Kotlin dan como resultado llegalStateException
  • Subsorting de una class para cambiar la varianza de un parámetro de tipo en Kotlin
  • Intentando cargar un file en la actividad principal de onCreate
  • ¿Puedo usar @autowire (spring-context) para una aplicación de escritorio kotlin?
  • Kotlin - Dagger 2 no está inyectando objects
  • Cómo resolver: Error: ejecución fallida para la tarea ': aplicación: kaptDebugKotlin'?
  • ¿Cómo instalar y configurar Kara Web Framework?
  • ¿Se considera idiomático preferir siempre las properties sobre los campos de respaldo?
  • No puedo build proyecto con Android Studio 2.3 y Gradle
  • Android - Kotlin: valor de retorno en la diversión asíncrona
  • La function de extensión no crea un nuevo object Observable