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, если он указан как savedInstanceState
; но он является savedInstanceState: Bundle?
(savedInstanceState: Bundle?
), а метод onCreate()
помечен как @Nullable
в источнике.
Я не встречал эту ошибку ни в одном из моих других проектов Котлина. Я использую Kotlin версии 1.1.2-5; и имела ту же ошибку с 1.1.2-3.
Ответы
Ответ 1
Похоже, проблема не в методе onCreate
. Попробуйте посмотреть на com.android.example.github.injection.AppInjector$init$1.onActivityCreated(AppInjector.kt)
. Я не могу сказать, был ли он сгенерированным классом, но он должен дать вам представление о том, что делать дальше.
Ответ 2
У меня была такая же проблема, вы должны сделать типы с нулевым значением:
override fun onCreatePreferences(bundle: Bundle?, s: String?) {}
Ответ 3
Проблема в AppInjector. Я использовал образец Google GitHubBrowser, как и вы, и столкнулся с этой же ошибкой. Я скопировал код в свой проект и позволил Android Studio преобразовать его в Kotlin. Когда он это сделал, он не указал должным образом значение savedInstanceState
параметра 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)
}
}
Ответ 4
Вы можете использовать оператор объединения нулей ?:
. savedInstanceState
будет передан методу super.onCreate
, только если это @NonNull
, в противном случае, если это null
, будет передан пустой Bundle()
.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState?: Bundle())
}
Ответ 5
Как отметил @mcassiano, проблема заключается не в методе onCreate
а в самом деле onActivityCreated
. Две мысли:
- Из-за того, что библиотеки и т.д. Находятся на переходном этапе, на данный момент вам может потребоваться просто вручную переопределить
onActivityCreated
в вашем фрагменте и явно пометить Bundle как nullable: (savedInstanceState: Bundle?)
. Вы не должны этого делать, но ручная настройка нулевой возможности может просто помочь. - Я замечаю, что сбой идет до BaseFragmentActivityGingerbread - это результат использования LifecycleActivity? Или у вас есть другие, более старые, устаревшие зависимости в вашем проекте?
Ответ 6
Вы знаете, что внутренняя функция super.onCreate
выглядит как public void onCreate(Bundle savedInstanceState)
, этот saveInstanceState не может быть нулевым и может вызывать функцию, которая может быть подключена к другим функциям. В моем случае 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!!)
}
}