【问题标题】:IllegalStateException: parcel.readString() must not be nullIllegalStateException:parcel.readString() 不能为空
【发布时间】:2018-01-23 02:26:31
【问题描述】:

我把Parcelable对象放在Intent到下一个Activity

val intent = Intent(mContext, ShowTestActivity::class.java)
intent.putExtra("test", test)
Log.d("myLog", "${intent.getParcelableExtra<Test>("test")}") // No problem
mContext.startActivity(intent)

并在下一个Activity得到这个对象:

if (!intent.hasExtra("test")) throw Exception("Intent doesn't has 'test' extra")
val test: Test = intent.getParcelableExtra("test")

这里抛出异常:

public open class QBase(): Parcelable {
  ...
  protected constructor(parcel: Parcel?) : this() {
      parcel?.let {
          question = parcel.readString() // parcel.readString() must not be null
          helpText = parcel.readString()
          qValue = parcel.readDouble()
          qType = QType.valueOf(parcel.readString())
      }
  }
  override fun writeToParcel(parcel: Parcel, flags: Int) {
      parcel.writeString(question)
      parcel.writeString(helpText)
      parcel.writeDouble(qValue)
      parcel.writeString(qType.name)
 }
  ...
}

在测试中:

public class Test(): Parcelable {
  ...
  public var questions: ArrayList<QBase> = ArrayList()

  constructor(parcel: Parcel?): this() {
      parcel?.let {
        ...
        parcel.readTypedList(questions, QBase.CREATOR)
      }
  }

  override fun writeToParcel(p: Parcel?, p1: Int) {
      p?.let {
          ...
          it.writeTypedList(questions)
      }
   }
   ...
}

这是一个例外:

原因:java.lang.IllegalStateException:parcel.readString() 不能为空 在 com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase.(QBase.kt:22) 在 com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase$CREATOR.createFromParcel(QBase.kt:70) 在 com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase$CREATOR.createFromParcel(QBase.kt:68) 在 android.os.Parcel.readTypedList(Parcel.java:2432) 在 com.vadim.hasdfa.justlearn.Model.Test.(Test.kt:28) 在 com.vadim.hasdfa.justlearn.Model.Test$CREATOR.createFromParcel(Test.kt:47) 在 com.vadim.hasdfa.justlearn.Model.Test$CREATOR.createFromParcel(Test.kt:45) 在 android.os.Parcel.readParcelable(Parcel.java:2787) 在 android.os.Parcel.readValue(Parcel.java:2681) 在 android.os.Parcel.readArrayMapInternal(Parcel.java:3048) 在 android.os.BaseBundle.unparcel(BaseBundle.java:257) 在 android.os.BaseBundle.containsKey(BaseBundle.java:435) 在 android.content.Intent.hasExtra(Intent.java:6859) 在 com.vadim.hasdfa.justlearn.Controller.Activity.BrowseTest.ShowTestActivity.onCreate(ShowTestActivity.kt:28) 在 android.app.Activity.performCreate(Activity.java:6980) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 在 android.os.Handler.dispatchMessage(Handler.java:105) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6540) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

【问题讨论】:

  • 您可以在获取对象之前在ShowTestActivity 中添加Intent intent = getIntent();
  • 在 kotlin 中 intent 在 Java 中表示 getIntent()
  • 哦,对不起我在 Kotlin 的穷人。
  • 好的,我做...然后所有的变量都是空的

标签: android android-intent kotlin parcelable


【解决方案1】:

question = parcel.readString() // parcel.readString() must not be null

可能你定义的字段question是一个非空字段,如果parcel.readString()的结果返回一个空值,就会抛出一个java.lang.IllegalStateException,把val question: String的定义改成@987654326 @ 然后再试一次。

【讨论】:

    【解决方案2】:

    基于answer - 目前唯一的解决方法是使实现parcelable的类的成员可以为空。

    【讨论】:

      【解决方案3】:

      因为你的字符串是空字符串,比如 question="null"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-16
        • 2020-10-06
        • 2015-10-27
        • 2021-01-22
        • 2017-09-04
        • 2016-08-18
        • 2013-04-30
        • 1970-01-01
        相关资源
        最近更新 更多