У меня есть kotlin.KotlinNullPointerException в строке:

val locationmanager=context!!.getSystemService(Context.LOCATION_SERVICE) as LocationManager

Когда я поворачиваю свой экран. Эта строка работает в:

class MyMapFragment: Fragment(),OnMapReadyCallback
0
dodododo97 19 Фев 2020 в 15:24

2 ответа

Лучший ответ

Действие уничтожается и воссоздается при повороте телефона. Это означает, что во время повторного создания действия контекст будет нулевым, и вы должны пытаться получить к нему доступ в какой-то момент во время этого.

Я не уверен, где у вас есть строка кода, которую вы разместили, но если вы хотите гарантировать ненулевой контекст, вам следует подождать, пока действие не будет создано.

var locationmanager: LocationManager? = null   

override fun onActivityCreated(savedInstanceState: Bundle?) {
    val context = context ?: return // this line gets a non-null context and is safer than !!

    locationmanager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager

    ...

В общем, при доступе к объектам, которые можно обнулять в Kotlin, гораздо предпочтительнее использовать ? вместо !!, чтобы избежать любых исключений нулевого указателя

1
Quinn 19 Фев 2020 в 17:32

Фрагмент может получить доступ к контексту только после вызова метода жизненного цикла onAttach, потому что в этом методе жизненного цикла он привязывается к активности своего хоста. Итак, чтобы избежать NPE вам нужно фрагментарно

lateinit var locationmanager: LocationManager

override fun onCreateView(inflater: LayoutInflater,
                          container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {
    locationmanager = context!!.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    return inflater.inflate(R.layout.your_fragment_layout, container, false)
}
1
Yrii Borodkin 19 Фев 2020 в 16:08