NPE на сейфе называется переменной в котлине. В чем причина и как ее можно решить? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть следующий фрагмент кода.

    var date1: Date? = null

    try {
        date1 = df1.parse(startDate)
    } catch (e: ParseException) {
        e.printStackTrace()
    }
    val cal1: Calendar? = Calendar.getInstance()
    cal1?.time = date1

И я получил NPE на последней строке. Вот трассировка стека. Это не очень часто, но иногда это происходит.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
       at java.util.Calendar.setTime(Calendar.java:1749)
       at ui.interviewslot.InterviewSlotActivity.getDates(InterviewSlotActivity.kt:443)
       at ui.interviewslot.InterviewSlotActivity.setUI(InterviewSlotActivity.kt:125)
       at ui.interviewslot.InterviewSlotActivity$onCreate$1.onChanged(InterviewSlotActivity.kt:78)
       at ui.interviewslot.InterviewSlotActivity$onCreate$1.onChanged(InterviewSlotActivity.kt:33)
       at androidx.lifecycle.LiveData.considerNotify(LiveData.java:113)
       at androidx.lifecycle.LiveData.dispatchingValue(LiveData.java:131)
       at androidx.lifecycle.LiveData.setValue(LiveData.java:289)
       at androidx.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
       at androidx.lifecycle.LiveData$1.run(LiveData.java:91)
       at android.os.Handler.handleCallback(Handler.java:808)
       at android.os.Handler.dispatchMessage(Handler.java:101)
       at android.os.Looper.loop(Looper.java:166)
       at android.app.ActivityThread.main(ActivityThread.java:7425)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

Устройство: HUAWEI P20 Lite Версия Android: 8.0.0

1 Ответ

4 голосов
/ 08 марта 2019

Метод calendar.setTime вызывает getTime для своего аргумента. Это вызовет NPE, если аргумент null. Я предполагаю, что ваша date1 переменная равна нулю, потому что анализ не удался. Вы можете исправить это, выполнив это:

val date1: Date? = try {
    df1.parse(startDate)
} catch (e: ParseException) {
    e.printStackTrace()
    null
}

if (date1 != null) {
    val cal1: Calendar? = Calendar.getInstance()
    cal1?.time = date1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...