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>()) } ... } 
  • Kotlin equivalente a Optional.map y una reference de método
  • ¿Puedo usar bibliotecas Java de terceros (.jar) para el desarrollo de Android con Kotlin?
  • Error de generación transformClassesWithDesugar después de actualizar a AS 3.0 Canary 6
  • Diferencia entre una class y un object en Kotlin
  • Kotlin - Continuar con la Corutina después de la Excepción
  • Android LiveData: MutableData nunca está en estado activo
  • Una buena forma de acceder a palabras mixtas de 8/16/32 bits
  • La documentation de Kotlin no admite tags como '<p>'.
  • ¿Cuál es la mejor manera de definir la constante de logging de TAG en Kotlin?
  • Escriba desajuste en ArrayOfNulls con Kotlin
  • cómo descartar DialogFragment de lambda especificado en el llamador Kotlin