IllegalArgumentException: savedInstanceState Указано как Non-Null Null

Я получаю странную ошибку, когда я запускаю MainActivity:

06-16 16:01:05.193 2083-2083/? E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.android.example.github, PID: 2083
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.example.github/com.android.example.github.ui.MainActivity}: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2666)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727)
            at android.app.ActivityThread.-wrap12(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6121)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
          Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
            at com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
            at android.app.Application.dispatchActivityCreated(Application.java:197)
            at android.app.Activity.onCreate(Activity.java:961)
            at android.support.v4.app.BaseFragmentActivityGingerbread.onCreate(BaseFragmentActivityGingerbread.java:54)
            at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:319)
            at com.android.example.github.ui.MainActivity.onCreate(MainActivity.kt:20)
            at android.app.Activity.performCreate(Activity.java:6682)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2619)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2727) 
            at android.app.ActivityThread.-wrap12(ActivityThread.java) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1478) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:154) 
            at android.app.ActivityThread.main(ActivityThread.java:6121) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

Это мой класс MainActivity:

class MainActivity : LifecycleActivity(), HasSupportFragmentInjector {

    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
        @Inject set

    lateinit var navigationController: NavigationController

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        if (savedInstanceState == null) {
            navigationController.navigateToSearch()
        }
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> {
        return dispatchingAndroidInjector
    }

}

Ошибка указывает, что параметр savedInstanceState имеет значение null, если он указан как savedInstanceState; но он является savedInstanceState: Bundle? (savedInstanceState: Bundle?), а метод onCreate() помечен как @Nullable в источнике.

Я не встречал эту ошибку ни в одном из моих других проектов Котлина. Я использую Kotlin версии 1.1.2-5; и имела ту же ошибку с 1.1.2-3.

Ответ 1

Похоже, проблема не в методе onCreate. Попробуйте посмотреть на com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt). Я не могу сказать, был ли он сгенерированным классом, но он должен дать вам представление о том, что делать дальше.

Ответ 2

У меня была такая же проблема, вы должны сделать типы с нулевым значением:

override fun onCreatePreferences(bundle: Bundle?, s: String?) {}

Ответ 3

Проблема в AppInjector. Я использовал образец Google GitHubBrowser, как и вы, и столкнулся с этой же ошибкой. Я скопировал код в свой проект и позволил Android Studio преобразовать его в Kotlin. Когда он это сделал, он не указал должным образом значение savedInstanceState параметра savedInstanceState, что и является причиной сбоя. Просто сделайте его необязательным, как в приведенном ниже коде, и он будет работать.

object AppInjector {
    fun init(app: App) {
        DaggerAppComponent.builder().application(app)
                .build().inject(app)
        app
                .registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
                    override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                        handleActivity(activity)
                    }

                    override fun onActivityStarted(activity: Activity) {

                    }

                    override fun onActivityResumed(activity: Activity) {

                    }

                    override fun onActivityPaused(activity: Activity) {

                    }

                    override fun onActivityStopped(activity: Activity) {

                    }

                    override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {

                    }

                    override fun onActivityDestroyed(activity: Activity) {

                    }
                })
    }

    private fun handleActivity(activity: Activity) {
        if (activity is HasSupportFragmentInjector) {
            AndroidInjection.inject(activity)
        }
        (activity as? FragmentActivity)?.supportFragmentManager?.registerFragmentLifecycleCallbacks(
                object : FragmentManager.FragmentLifecycleCallbacks() {
                    override fun onFragmentCreated(fm: FragmentManager?, f: Fragment?,
                                                   savedInstanceState: Bundle?) {
                        if (f is Injectable) {
                            AndroidSupportInjection.inject(f)
                        }
                    }
                }, true)
    }
}

Ответ 4

Вы можете использовать оператор объединения нулей ?:. savedInstanceState будет передан методу super.onCreate, только если это @NonNull, в противном случае, если это null, будет передан пустой Bundle().

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState?: Bundle())
}

Ответ 5

Как отметил @mcassiano, проблема заключается не в методе onCreate а в самом деле onActivityCreated. Две мысли:

  • Из-за того, что библиотеки и т.д. Находятся на переходном этапе, на данный момент вам может потребоваться просто вручную переопределить onActivityCreated в вашем фрагменте и явно пометить Bundle как nullable: (savedInstanceState: Bundle?). Вы не должны этого делать, но ручная настройка нулевой возможности может просто помочь.
  • Я замечаю, что сбой идет до BaseFragmentActivityGingerbread - это результат использования LifecycleActivity? Или у вас есть другие, более старые, устаревшие зависимости в вашем проекте?

Ответ 6

Вы знаете, что внутренняя функция super.onCreate выглядит как public void onCreate(Bundle savedInstanceState), этот saveInstanceState не может быть нулевым и может вызывать функцию, которая может быть подключена к другим функциям. В моем случае super.onCreate подключается к onCreatePreferences, тогда я исправил эту проблему, этот код следующий для:

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

    addPreferencesFromResource(R.xml.preferences_pomodoro)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState?:Bundle.EMPTY)

    if (context != null) {
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context!!)
    }
}