3

私は Kotlin を初めて使用し、既存のコードベースにある多くの Android Util メソッドの 1 つを Kotlin 拡張関数に変換しようとしています。

これはコトリンコードです:

fun Activity?.isAlive(): Boolean {
    return !(this?.isFinishing ?: false)
}

これは、次の Java メソッドに相当するものです。

public static boolean isAlive(Activity activity) {
    return activity != null && !activity.isFinishing();
}

ただし、 anが であるときはNPEsいつでも Kotlin コードを取得しています。私が間違っているところについて何か考えはありますか?Activitynull

4

3 に答える 3

7

isAlive()関数内ではなく、 が参照された後のどこかで NPE を取得すると思いますActivity。これは、 が受信側で.isAlive()返されることが原因である可能性があります。truenull

これは、レシーバーがnullである場合、this?.isFinishing ?: falseは正しいブランチfalseを選択するため、 であるから!(this?.isFinishing ?: false)ですtrue

受信側で返されるように、関数をいずれかの方法で変更してみてください。次に例を示しfalseます。null

fun Activity?.isAlive(): Boolean = !(this?.isFinishing ?: true)
于 2016-10-19T15:23:35.543 に答える