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 (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

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

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) вылетали из строя, и просто? на Bundle в 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 в вашем фрагменте и явно пометить Bundle как допускающий значение NULL: (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