Android IllegalArgumentException:指定为非Null的savedInstanceState为Null

Android IllegalArgumentException:指定为非Null的savedInstanceState为Null,android,android-activity,kotlin,Android,Android Activity,Kotlin,启动main活动时,我遇到一个奇怪的错误: 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/

启动
main活动时,我遇到一个奇怪的错误:

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) 
这是我的
main活动
课程:

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
    }

}
class MainActivity:LifecycleActivity(),HasSupportFragmentInjector{
lateinit var分派AndroidInjector:分派AndroidInjector
@注入装置
lateinit变量navigationController:navigationController
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.main_活动)
如果(savedInstanceState==null){
navigationController.navigateToSearch()
}
}
重写fun supportFragmentInjector():AndroidInjector{
回程调度和回程调度
}
}
当参数
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)
。我不知道它是否是一个生成的类,但它应该让您知道下一步要做什么。

正如@mcassiano所指出的,问题似乎不在于您的
onCreate
方法,而在于实际创建的
onActivityCreated
。两个想法:

  • 由于库等正在转换中,现在您可能需要在片段中手动覆盖
    onActivityCreated
    ,并显式地将Bundle标记为可空:
    (savedInstanceState:Bundle?
    )。您不必这样做,但是手动设置可空性可能会有所帮助
  • 我注意到崩溃一直到BaseFragmentActivityGingerbread——这是使用LifecycleActivity的结果吗?或者您的项目中是否存在其他旧的过时依赖项

我遇到了完全相同的问题,您必须在此处创建可为空的类型:

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

问题出在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)
    }
}

您可以使用空合并运算符
?:
savedInstanceState
将被传递给
super.onCreate
方法,仅当它是
@NonNull
时,否则,如果它是
null
,将传递一个空的
Bundle()

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

您知道,内部函数
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!!)
    }
}

如果其他方法无效,您可以通过以下方式传递空包:

if (savedInstanceState == null)
    savedInstanceState = new Bundle();
super.onCreate(savedInstanceState);
或者,如果您总是想要一个空包,那么只需:

super.onCreate(new Bundle());

梅恩不太漂亮,但很管用。

我也有同样的问题。AppInjector有什么问题,你能提出建议吗?如果我无法更改此定义怎么办?对于示例SDK库函数!谢谢我的DialogFragments(从Android Studio从java转换成Kotlin)崩溃了,只是一个简单的问题?在
onCreateDialog(savedInstanceState:Bundle?):对话框中的Bundle上
修复了它!这似乎改变了继承函数的签名。我确认它可以工作,但是没有编译器错误。我们还可以通过什么方式更改重写的函数的签名?@LucasP。非常感谢。你救了我几个小时!谢谢你添加了一个答案!请您解释一下您在解决方案中所做的工作好吗?