NPE для безопасной вызываемой переменной в kotlin. В чем причина этого и как это можно решить?

#android #kotlin #nullpointerexception

#Android #kotlin #исключение nullpointerexception

Вопрос:

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

     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. Что, если date1 равно нулю?

2. Пожалуйста, опубликуйте результат println(date)

3. @DalijaPrasnikar Извините, ребята, я пропустил эту часть. Я не проверял, что такое cal1? .время делает. Спасибо

Ответ №1:

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

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

if (date1 != null) {
    val cal1: Calendar? = Calendar.getInstance()
    cal1?.time = date1
}