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, когато е указан като не-null; но е nullable (savedInstanceState: Bundle?) и методът onCreate() е маркиран като @Nullable в източника.

Не съм срещал тази грешка в нито един от другите си проекти в Kotlin. Използвам Kotlin версия 1.1.2-5; и имаше същата грешка с 1.1.2-3.


person Bryan    schedule 16.06.2017    source източник
comment
Имам същия проблем. какъв е проблемът с AppInjector, можете ли да го предложите   -  person Ramki Anba    schedule 27.12.2017


Отговори (7)


Изглежда, че проблемът не е в метода onCreate. Опитайте да погледнете com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt). Не мога да кажа дали е генериран клас, но трябва да ви даде идея какво да правите по-нататък.

person mcassiano    schedule 16.06.2017

Имах абсолютно същия проблем, трябва да направите nullable типове тук:

override fun onCreatePreferences(bundle: Bundle?, s: String?) {}
person lxknvlk    schedule 26.06.2017
comment
Ами ако не мога да променя това определение? например SDK библиотека функции! - person Kishore Jethava; 31.12.2017
comment
Благодаря! Моите DialogFragments (преобразувани от java в Kotlin от Android Studio) се сриваха и просто ? на пакета в onCreateDialog(savedInstanceState: Bundle?): Dialog го поправи! - person Lucas P.; 09.03.2018
comment
Изглежда, че това променя сигнатурата на наследена функция. Потвърдих обаче, че работи, няма грешки на компилатора. По какви други начини можем да променим сигнатурата на функция, която заместваме? - person Michael Osofsky; 21.05.2018
comment
@LucasP. Благодаря ти! Ти ми спести часове! - person Paras Sidhu; 01.05.2020

Проблемът е в AppInjector. Използвах пробата на Google GitHubBrowser като вас и попаднах на същата грешка. Копирах кода в моя проект и оставих Android Studio да го преобразува в Kotlin. Когато направи това, той не уточни правилно нулевостта на параметъра 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)
    }
}
person Chris    schedule 13.01.2018

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

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState?: Bundle())
}
person Andrew Bekhtold    schedule 13.02.2019
comment
Благодаря, че добавихте отговор! Имате ли нещо против да обясните какво правите във вашето решение? - person Jack Moody; 13.02.2019

Както отбеляза @mcassiano, изглежда, че проблемът не е във вашия onCreate метод, а всъщност onActivityCreated. Две мисли:

  • Поради факта, че библиотеките и други подобни са в преход, засега може да се наложи просто ръчно да замените onActivityCreated във вашия фрагмент и изрично да маркирате пакета като nullable: (savedInstanceState: Bundle?). Не би трябвало да се налага, но ръчното настройване на нулата може просто да помогне.
  • Забелязвам, че сривът стига чак до BaseFragmentActivityGingerbread - това резултат ли е от използването на LifecycleActivity? Или имате други, по-стари, неактуални зависимости във вашия проект?
person creativedrewy    schedule 16.06.2017

Знаете, че вътре във функция super.onCreate изглежда като public void onCreate(Bundle savedInstanceState) това saveInstanceState не може да бъде Null и може да извиква функция, която може да се свърже с други функции. В моя случай 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!!)
    }
}
person Ku narutokan    schedule 04.10.2019

ако нищо друго не работи, можете просто да подадете празен пакет по този начин:

if (savedInstanceState == null)
    savedInstanceState = new Bundle();
super.onCreate(savedInstanceState);

или ако винаги искате празен пакет, тогава просто:

super.onCreate(new Bundle());

Може би не е толкова красиво, но работи.

person Amir Golan    schedule 19.09.2020