2017-02-07 1 views
2
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) { } 
    } 
} 

スロー例:記入:ru.WalletConfig.setClientUrlでjava.lang.NullPointerExceptionが(WalletConfig.kt)ObjectコンストラクタとDelegates.notNull

+0

はあなたが貼り付けコードがNPEで失敗しているものであるよろしいです:

はあなただけそうのようにそれらを並べ替える必要がある問題を修正するには?それはコンパイルされません。 – miensol

答えて

6

問題が発生している:ロード設定ファイル 'wallet.config'ご注文はinitブロックとプロパティの初期化を注文しました。 answer about class initialization semanticsに記載されています。 initブロックはコンストラクタではありません。そのコードはプライマリコンストラクタに含まれています。

次の例:

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

val a = OrderOfInits() 

印刷なります

A 
B 
C 
constructor 

プロパティデリゲートの初期化は、プライマリコンストラクターの一部です。つまり、init { fill(...) }イニシャライザブロックはclientUrlセッタを呼び出し、次にDelegates.notNull()インスタンスメソッドを呼び出そうとします。しかし、Delegates.notNull()を保持するインスタンスフィールドはまだ設定されていませんでした。

object WalletConfig { 
    var clientUrl: String by Delegates.notNull() 
     private set 

    init { 
     fill(HashMap<String, String>()) 
    } 
    ... 
} 
関連する問題