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的结果吗? 或者你的项目中是否还有其他过时的依赖关系?
- 使用Kotlin @Parcelize和多态
- java.lang.RuntimeException:将结果ResultInfo(who = null,request = 1888,result = 0,data = null)传递给activity
- Kotlin和Android Databinding
- 当使用Mockito和kotlin时,只允许在类文字的左侧使用类
- 将像素转换为dp
- 错误:包含非法的最终字段-Kotlin
- java.lang.ClassNotFoundException:未在路径中找到类“com.my.app.example.Main”:DexPathList
- 为Kotlin创建POJO类
- API调用不能在Anko Async中使用