android - IllegalStateException : parcel. readString() 不能为空

标签 android android-intent kotlin parcelable

我将 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)
      }
   }
   ...
}

这是一个异常(exception):

Caused by: java.lang.IllegalStateException: parcel.readString() must not be null at com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase.(QBase.kt:22) at com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase$CREATOR.createFromParcel(QBase.kt:70) at com.vadim.hasdfa.justlearn.Model.Questions.utils.QBase$CREATOR.createFromParcel(QBase.kt:68) at android.os.Parcel.readTypedList(Parcel.java:2432) at com.vadim.hasdfa.justlearn.Model.Test.(Test.kt:28) at com.vadim.hasdfa.justlearn.Model.Test$CREATOR.createFromParcel(Test.kt:47) at com.vadim.hasdfa.justlearn.Model.Test$CREATOR.createFromParcel(Test.kt:45) at android.os.Parcel.readParcelable(Parcel.java:2787) at android.os.Parcel.readValue(Parcel.java:2681) at android.os.Parcel.readArrayMapInternal(Parcel.java:3048) at android.os.BaseBundle.unparcel(BaseBundle.java:257) at android.os.BaseBundle.containsKey(BaseBundle.java:435) at android.content.Intent.hasExtra(Intent.java:6859) at com.vadim.hasdfa.justlearn.Controller.Activity.BrowseTest.ShowTestActivity.onCreate(ShowTestActivity.kt:28) at android.app.Activity.performCreate(Activity.java:6980) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)  at android.app.ActivityThread.-wrap11(Unknown Source:0)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)  at android.os.Handler.dispatchMessage(Handler.java:105)  at android.os.Looper.loop(Looper.java:164)  at android.app.ActivityThread.main(ActivityThread.java:6540)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

最佳答案

question = parcel.readString()//parcel.readString() 不能为空

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

关于android - IllegalStateException : parcel. readString() 不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45688232/

相关文章:

php - Android Web 服务 - "poke"Web 服务

android - 如何使用 com.android.calendar.DayView?

android - 在 android 中创建了新类,但无法弄清楚上下文

android - 如何使用原生 Android 相机捕获图像并将其存储

android - 具有一个 Activity 的多个文件扩展名/mimetype Intent 过滤器

android - 从一个 Activity 中取出一个字符串数组来填充另一个 ListView Activity

junit - Kotlin:gson 之后的单元测试断言对象

java - Android本地VPN服务: can't get response

android - 如何在微调器中添加提示

java - 同一 View 上的两个独立的可滚动 fragment - Android