IllegalArgumentException:savedInstanceState指定为非空为空

当我启动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 @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 { return dispatchingAndroidInjector } } 

该错误指出参数savedInstanceState为空时,当它指定为非空; 但是它是可空的( savedInstanceState: Bundle? ),并且onCreate()方法在源代码中被标记为@Nullable

在我的其他Kotlin项目中,我没有遇到过这个错误。 我正在使用Kotlin版本1.1.2-5; 并与1.1.2-3有相同的错误。

这似乎是问题不在onCreate方法。 试着看看com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt) 。 我不知道它是否是一个生成的类,但它应该让你知道下一步该怎么做。

我有完全相同的问题,你必须在这里做可为空的types:

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

问题出在AppInjector上。 我像你一样使用谷歌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) } } 

正如@mcassiano指出的,看起来问题不是你的onCreate方法,而是实际onActivityCreated 。 两个想法:

  • 由于库等处于转换状态,现在您可能必须手动覆盖片段中的onActivityCreated ,并将Bundle显式标记为空(savedInstanceState: Bundle?) 。 你不应该,但手动设置可空性可能只是帮助。
  • 我注意到崩溃一直下降到BaseFragmentActivityGingerbread – 这是使用LifecycleActivity的结果吗? 或者你的项目中是否还有其他过时的依赖关系?