运行时异常:ClassCastException android.os.Bundle无法强制转换为Parcelable类



当我安装新代码并运行它时,我遇到了这个崩溃,下面我附加了旧代码和新代码。请告诉我我们该如何解决这些问题?

旧代码:

// data class
public class X {
int val;
....
....
}
public final HelperClass {
static Bundle toBundle(X obj) {
toDataMap(obj).toBundle();
}
static DataMap toDataMap(X obj) {
DataMap dataMap = new DataMap();
dataMap.putInt("id", obj.val);
....
....
return dataMap;
}
}
// used in an activity on a onClick
context.startActivity(new Intent(ACTION_VIEW)
.putExtra(X_INSTANCE_EXTRA, HelperClass.toBundle(new X())));
// received in the activity started by the intent
X obj = bundle.getBundle(X_INSTANCE_EXTRA);

新代码:

// data class
public class X implements Parcelable {
int val;
....
....
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(val);
...
...
}
public static final Parcelable.Creator<X> CREATOR =
new Parcelable.Creator<X>() {
@Override
public X createFromParcel(Parcel in) {
X obj = new X();
x.val = in.readInt();
...}
};
}
// used in an activity on a onClick
context.startActivity(new Intent(ACTION_VIEW)
.putExtra(X_INSTANCE_EXTRA, new X());
// received in the activity started by the intent
X obj = intent.getParcelableExtra(X_INSTANCE_EXTRA);

我在新代码的最后一行收到错误,说明

java.lang.ClassCastException: android.os.Bundle cannot be cast to X

是因为在旧代码上激发了一些意图,并在新代码中接收到了这些意图吗?

如果您想对已经在字段中(安装在用户设备上(的代码进行这样的更改,那么您需要使您的更改向后兼容。一个例子是为X_INSTANCE_EXTRA使用不同的键(即:更改名称(,这样就不会与旧代码发生冲突。另一种方法是预期异常并验证此处返回的对象类型:

X obj = intent.getParcelableExtra(X_INSTANCE_EXTRA);

像这样:

try {
X obj = intent.getParcelableExtra(X_INSTANCE_EXTRA);
// Extra is the correct type, continue processing...
} catch (ClassCastException e) {
// Not of the correct type, so this is old stuff, do something appropriate...
}

这有点难看,我通常不会这么做。当你对已经存在的软件进行更改时,你需要考虑向后兼容性。试着做出改变,这样旧东西就不会坏掉。

最新更新