:kotlin.UninitializedPropertyAccessException:lateinit属性管理器尚未初始化

问题描述 投票:0回答:1

我正在开发新闻,并且正在遵循nullpointexception

java.lang.RuntimeException: Unable to start activity ComponentInfo{yodgorbek.komilov.musobaqayangiliklari/yodgorbek.komilov.musobaqayangiliklari.ui.WelcomeActivity}: kotlin.UninitializedPropertyAccessException: lateinit property manager has not been initialized
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2976)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3113)
 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1858)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loop(Looper.java:201)
 at android.app.ActivityThread.main(ActivityThread.java:6820)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:922)
Caused by: kotlin.UninitializedPropertyAccessException: lateinit property manager has not been initialized
 at yodgorbek.komilov.musobaqayangiliklari.ui.WelcomeActivity.onCreate(WelcomeActivity.kt:26)
 at android.app.Activity.performCreate(Activity.java:7224)
 at android.app.Activity.performCreate(Activity.java:7213)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2956)
 ... 11 more

在我的WelcomeActivity.kt类下面

class WelcomeActivity : AppIntro() {


    private  lateinit  var manager: PreferencesManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Make sure you don't call setContentView!

        if (manager.isFirstRun()) {
            showIntroSlides()
        } else {
            goToMain()
        }
    }

        // Call addSlide passing your Fragments.

        // You can use AppIntroFragment to use a pre-built fragment

       private fun showIntroSlides() {
           manager.setFirstRun()
           addSlide(
                AppIntroFragment.newInstance(
                    title = "Welcome to the NewsApp",
                    description = "NewsApp give your information about life news around the world",
                    imageDrawable = R.drawable.news,
                    backgroundDrawable = R.drawable.news_slider,
                    titleColor = Color.YELLOW,
                    descriptionColor = Color.RED,
                    backgroundColor = Color.BLUE,
                    titleTypefaceFontRes = R.font.opensans_light,
                    descriptionTypefaceFontRes = R.font.opensans_regular
                )
            )
            addSlide(
                AppIntroFragment.newInstance(
                    title = "...Let's get started!",
                    description = "This is the last slide, I won't annoy you more :)"
                )
            )
        }

    private fun goToMain() {
        startActivity(Intent(this, MainActivity::class.java))
    }

    override fun onSkipPressed(currentFragment: Fragment?) {
        super.onSkipPressed(currentFragment)
      goToMain()


    }

    override fun onDonePressed(currentFragment: Fragment?) {
        super.onDonePressed(currentFragment)
        goToMain()
    }
    override fun onSlideChanged(oldFragment: Fragment?, newFragment: Fragment?) {
        super.onSlideChanged(oldFragment, newFragment)
        Log.d("Hello", "Changed")
    }
}

即使我尝试按照以下方式初始化管理器,我也不明白是什么导致空指针异常

private var manager: PreferencesManager? = null 

但是它不能解决我的问题我想知道我在哪里犯了错误,我该怎么做才能避免nullpointer异常

android kotlin nullpointerexception
1个回答
0
投票

通过查看日志很简单。您的manager在使用前未初始化。看onCreate

    private  lateinit  var manager: PreferencesManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // Make sure you don't call setContentView!

        // <<<<<<<<<<<<<<< INITIALISE manager HERE >>>>>>>>>>>>>>

        if (manager.isFirstRun()) { <<<<<<<< HERE you are using an uninitilised manager
            showIntroSlides()
        } else {
            goToMain()
        }
    }

初始化managerif (manager.isFirstRun()) {之前的onCreate()

© www.soinside.com 2019 - 2024. All rights reserved.