【问题标题】:IllegalArgumentException: savedInstanceState Specified as Non-Null is NullIllegalArgumentException: savedInstanceState Specified as Non-Null is Null
【发布时间】:2017-06-16 20:18:18
【问题描述】:

我在启动 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 有相同的错误。

【问题讨论】:

  • 我有同样的问题。 AppInjector 有什么问题,你能建议一下吗

标签: android android-activity kotlin


【解决方案1】:

我遇到了完全相同的问题,你必须在这里创建可空类型:

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

【讨论】:

  • 如果我不能改变这个定义怎么办?例如。 SDK 库函数!
  • 谢谢!我的 DialogFragments(从 Android Studio 将 java 转换为 Kotlin)崩溃了,只是一个简单的 ?在 onCreateDialog(savedInstanceState: Bundle?): Dialog 的 Bundle 中修复它!
  • 似乎这改变了继承函数的签名。我确认它可以工作,但没有编译器错误。我们可以通过哪些其他方式更改我们覆盖的函数的签名?
  • @LucasP。谢谢你!你为我节省了几个小时!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用空合并运算符?:。只有@NonNull 时,savedInstanceState 才会传递给super.onCreate 方法,否则,如果是null,则传递一个空的Bundle()

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

    【讨论】:

    • 感谢您添加答案!您介意解释一下您在解决方案中做了什么吗?
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      正如@mcassiano 所说,问题似乎不在于您的onCreate 方法,而实际上是onActivityCreated。两个想法:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          如果没有其他方法,您可以通过这种方式传递一个空的 Bundle:

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

          或者如果您总是想要一个空包,那么只需:

          super.onCreate(new Bundle());
          

          Mayne 不那么漂亮,但很管用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-12-01
            • 2014-12-31
            • 2022-08-12
            相关资源
            最近更新 更多