IllegalArgumentException:savedInstanceState指定为Non-Null为Null

时间:2017-06-16 20:18:19

标签: android android-activity kotlin

当我开始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
    }

}

当错误指定为非null时,该错误表明参数savedInstanceState为null;但它可以为空(savedInstanceState: Bundle?),onCreate()方法在源代码中标记为@Nullable

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

7 个答案:

答案 0 :(得分:49)

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

<select required name="fontSize">
  <option value="">Please select</option>
  <option value="9">9 px</option>
  <option value="10">10 px</option>
  <option value="11">11 px</option>
  <option value="12">12 px</option>
  <option value="13">13 px</option>
  <option value="14">14 px</option>
  <option value="15" selected="">15 px</option>
  <option value="16">16 px</option>
</select>

<select name="fontColor">
  <option value="">Please select</option>
  <option value="red">Red</option>
  <option value="green">Green</option>
  <option value="blue">Blue</option>
</select>

答案 1 :(得分:8)

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

答案 2 :(得分:7)

问题出在AppInjector中。我像你一样使用谷歌GitHubBrowser示例并遇到了同样的错误。我将代码复制到我的项目中,让Android Studio将其转换为Kotlin。当它这样做时,它没有正确地指定导致崩溃的b'{"message":"Invalid Field for addIssues: repo_id,issue_number"}'参数的可为空性。只需将其设置为可选,如下面的代码所示,它将起作用。

savedInstanceState

答案 3 :(得分:3)

您可以使用空值运算符?:savedInstanceState仅在为super.onCreate时才传递给@NonNull方法,否则,如果为null,则将传递空的Bundle()。 / p>

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

答案 4 :(得分:2)

正如@mcassiano所指出的那样,问题似乎不是onCreate方法,而是实际onActivityCreated。两个想法:

  • 由于库等正处于转换状态,目前您可能只需手动覆盖片段中的onActivityCreated并明确将Bundle标记为可为空:(savedInstanceState: Bundle?)。你不应该这样做,但手动设置可空性可能会有所帮助。
  • 我注意到崩溃一直到BaseFragmentActivityGingerbread - 这是使用LifecycleActivity的结果吗?或者您的项目中是否有其他较旧的过时依赖项?

答案 5 :(得分:0)

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

答案 6 :(得分:0)

如果没有其他效果,则可以通过以下方式传递一个空的捆绑包:

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

或者如果您始终想要一个空捆绑包,则只需:

super.onCreate(new Bundle());

梅恩不是那么漂亮,但可以。