Stacktrace
При возникновении критической ошибки в kotlin коде в лог будет выброшен stacktrace исключения (exception). Например:
Function doesn't have or inherit @Throws annotation and thus exception isn't propagated from Kotlin to Objective-C/Swift as NSError.
It is considered unexpected and unhandled instead. Program will be terminated.
Uncaught Kotlin exception: kotlin.NullPointerException
at 0 MultiPlatformLibrary 0x00000001063132f3 kfun:kotlin.Throwable#<init>(){} + 67 (/Users/teamcity1/teamcity_work/11ac87a349af04d5/runtime/src/main/kotlin/kotlin/Throwable.kt:27:21)
at 1 MultiPlatformLibrary 0x000000010630b7dc kfun:kotlin.Exception#<init>(){} + 60 (/Users/teamcity1/teamcity_work/11ac87a349af04d5/runtime/src/main/kotlin/kotlin/Exceptions.kt:21:28)
at 2 MultiPlatformLibrary 0x000000010630ba4c kfun:kotlin.RuntimeException#<init>(){} + 60 (/Users/teamcity1/teamcity_work/11ac87a349af04d5/runtime/src/main/kotlin/kotlin/Exceptions.kt:32:28)
at 3 MultiPlatformLibrary 0x000000010630bcbc kfun:kotlin.NullPointerException#<init>(){} + 60 (/Users/teamcity1/teamcity_work/11ac87a349af04d5/runtime/src/main/kotlin/kotlin/Exceptions.kt:43:28)
at 4 MultiPlatformLibrary 0x000000010636714c ThrowNullPointerException + 124 (/Users/teamcity1/teamcity_work/11ac87a349af04d5/runtime/src/main/kotlin/kotlin/native/internal/RuntimeUtils.kt:13:11)
at 5 MultiPlatformLibrary 0x00000001059a4d1e kfun:dev.icerock.library.feature.information.presentation.InformationFilterViewModel.<init>$lambda-2#internal + 382 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/presentation/InformationFilterViewModel.kt:36:86)
at 6 MultiPlatformLibrary 0x00000001059a5bb5 kfun:dev.icerock.library.feature.information.presentation.InformationFilterViewModel.$<init>$lambda-2$FUNCTION_REFERENCE$435.invoke#internal + 181 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/presentation/InformationFilterViewModel.kt:36:62)
at 7 MultiPlatformLibrary 0x000000010659c5b8 kfun:dev.icerock.moko.mvvm.livedata#map@dev.icerock.moko.mvvm.livedata.LiveData<0:0>(kotlin.Function1<0:0,0:1>){0§<kotlin.Any?>;1§<kotlin.Any?>}dev.icerock.moko.mvvm.livedata.LiveData<0:1> + 424 (/Users/runner/work/moko-mvvm/moko-mvvm/mvvm-livedata/src/commonMain/kotlin/dev/icerock/moko/mvvm/livedata/LiveDataTransforms.kt:8:43)
at 8 MultiPlatformLibrary 0x00000001059a3767 kfun:dev.icerock.library.feature.information.presentation.InformationFilterViewModel#<init>(dev.icerock.moko.mvvm.dispatcher.EventsDispatcher<dev.icerock.library.feature.information.presentation.InformationFilterViewModel.EventsListener>;dev.icerock.components.filter.FilterViewModel.FilterRepository;dev.icerock.library.feature.information.di.Strings){} + 3047 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/presentation/InformationFilterViewModel.kt:36:58)
at 9 MultiPlatformLibrary 0x000000010599b8fd kfun:dev.icerock.library.feature.information.di.InformationFactory#createInformationFilterViewModel(dev.icerock.moko.mvvm.dispatcher.EventsDispatcher<dev.icerock.library.feature.information.presentation.InformationFilterViewModel.EventsListener>){}dev.icerock.library.feature.information.presentation.InformationFilterViewModel + 493 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/di/InformationFactory.kt:87:37)
at 10 MultiPlatformLibrary 0x0000000105cfc865 objc2kotlin.1086 + 277 (/<compiler-generated>:1:0)
at 11 mokoApp 0x00000001045f2af8 $s7mokoApp22InformationCoordinatorC14routeToFiltersyyFTo + 24
at 12 MultiPlatformLibrary 0x0000000105cf8e3f objc2kotlin.1031 + 911
at 13 MultiPlatformLibrary 0x00000001059ab9f8 kfun:dev.icerock.library.feature.information.presentation.InformationViewModel.$onFilterTap$lambda-2$FUNCTION_REFERENCE$442.invoke#internal + 72 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/presentation/InformationViewModel.kt:66:40)
at 14 MultiPlatformLibrary 0x00000001059aba71 kfun:dev.icerock.library.feature.information.presentation.InformationViewModel.$onFilterTap$lambda-2$FUNCTION_REFERENCE$442.$<bridge-UNNN>invoke(-1:0){}#internal + 97 (/Developer/app-mobile/mpp-library/feature/information/src/commonMain/kotlin/ru/app/library/feature/information/presentation/InformationViewModel.kt:66:40)
at 15 MultiPlatformLibrary 0x0000000106588939 kfun:dev.icerock.moko.mvvm.dispatcher.EventsDispatcher.dispatchEvent$lambda-0#internal + 233 (/Users/runner/work/moko-mvvm/moko-mvvm/mvvm-core/src/iosMain/kotlin/dev/icerock/moko/mvvm/dispatcher/EventsDispatcher.kt:48:13)
at 16 MultiPlatformLibrary 0x0000000106588ae4 kfun:dev.icerock.moko.mvvm.dispatcher.EventsDispatcher.$dispatchEvent$lambda-0$FUNCTION_REFERENCE$0.invoke#internal + 68 (/Users/runner/work/moko-mvvm/moko-mvvm/mvvm-core/src/iosMain/kotlin/dev/icerock/moko/mvvm/dispatcher/EventsDispatcher.kt:47:31)
at 17 MultiPlatformLibrary 0x0000000106588b40 kfun:dev.icerock.moko.mvvm.dispatcher.EventsDispatcher.$dispatchEvent$lambda-0$FUNCTION_REFERENCE$0.$<bridge-UNN>invoke(){}#internal + 64 (/Users/runner/work/moko-mvvm/moko-mvvm/mvvm-core/src/iosMain/kotlin/dev/icerock/moko/mvvm/dispatcher/EventsDispatcher.kt:47:31)
at 18 MultiPlatformLibrary 0x0000000106588c29 _6465762e696365726f636b2e6d6f6b6f3a6d76766d2d636f7265_knbridge4 + 185 (/Users/runner/work/moko-mvvm/moko-mvvm/mvvm-core/src/iosMain/kotlin/dev/icerock/moko/mvvm/dispatcher/EventsDispatcher.kt:47:31)
at 19 libdispatch.dylib 0x000000010aa2b7ec _dispatch_call_block_and_release + 12
at 20 libdispatch.dylib 0x000000010aa2c9c8 _dispatch_client_callout + 8
at 21 libdispatch.dylib 0x000000010aa3ae75 _dispatch_main_queue_callback_4CF + 1152
at 22 CoreFoundation 0x00007fff2038fdbb __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
at 23 CoreFoundation 0x00007fff2038a63e __CFRunLoopRun + 2685
at 24 CoreFoundation 0x00007fff203896d6 CFRunLoopRunSpecific + 567
at 25 GraphicsServices 0x00007fff2c257db3 GSEventRunModal + 139
at 26 UIKitCore 0x00007fff24696cf7 -[UIApplication _run] + 912
at 27 UIKitCore 0x00007fff2469bba8 UIApplicationMain + 101
at 28 mokoApp 0x00000001045bf758 main + 56 (/Developer/app-mobile/ios-app/src/AppDelegate.swift:<unknown>)
at 29 libdyld.dylib 0x00007fff2025a3e9 start + 1
CoreSimulator 732.18.6 - Device: iPhone 12 mini (D5DBD7AE-E94F-4FAE-9B07-C00C4B32F504) - Runtime: iOS 14.4 (18D46) - DeviceType: iPhone 12 mini
В stacktrace доступно несколько важных вещей:
Uncaught Kotlin exception: kotlin.NullPointerException
- какая ошибка произошла. Здесь мы видим что не был обработан (не отловлен try catch блоком) эксепшенkotlin.NullPointerException
. Он означает что там, где не должно быть null, при работе приложения оказался null.- В стектрейсе на 4 позиции находится
ThrowNullPointerException
- это автоматическая проверка, которую компилятор ставит во все места чтения переменных, которые помечены как не нуллабл. Именно в этом методе происходит проверка в рантайме является ли указатель null или же там объект. В случае если там null - происходит выброс исключенияkotlin.NullPointerException
. - Все что выше
ThrowNullPointerException
- конструкторы всей иерархии классов exception'ов (выбрасываетсяkotlin.NullPointerException
, а значит создается объект этого класса и вызываются все конструкторы суперклассов). - Прямо под
ThrowNullPointerException
находится место, где в действительности произошла ошибка - именно туда нужно идти и исправлять. Там же указан и файл и строка -InformationFilterViewModel.kt:36
В данном кейсе по этой строке находился код:
val categoryField: LiveData<FilterField> = fieldsMap.map { it[CATEGORY_FIELD_KEY]!! }
В данном коде используется force-cast (!!
) - то есть разработчик намеренно указывал компилятору что тут точно не будет null. Но при выполнении программы в данном объекте по этому ключу оказался все таки null и произошел вылет.