爱热闹的松鼠 · 物联网络管理平台的签名机制_物联网络管理平台 ...· 1 周前 · |
逆袭的蘑菇 · 【java框架】SpringMVC(4) ...· 1 周前 · |
淡定的地瓜 · iOS 通信通知 ...· 6 天前 · |
小胡子的小虾米 · Python获取秒级时间戳与毫秒级时间戳的方 ...· 4 月前 · |
光明磊落的毛巾 · maven同一个项目中,一个子模块引用另一个 ...· 5 月前 · |
大方的铁板烧 · Newtonsoft.Json:JObjec ...· 8 月前 · |
阳刚的玉米 · C#反射创建List实体 - lovewl ...· 11 月前 · |
听话的板栗 · java calculate md5sum-掘金· 1 年前 · |
当我试图从intent执行getExtra时,我得到了这个错误。
getIntent().getParcelableArrayListExtra(KEY)
当我更改密钥时,错误就变成了
java.lang.NullPointerException
。我不能理解为什么会发生这种事。有许多Parcelable对象工作得很好。这也工作得很好(所以,Parcelable对象没有问题),直到我将其他对象放入具有不同键值对的意图中,也可能做错了什么。有人能告诉我为什么会发生这个错误吗?这种类型的错误背后可能的原因是什么?
您还可以查看日志。
02-24 02:55:21.927 28362-28362/com.abc.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.app, PID: 28362
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abc.app/com.abc.app.activity.FinalActivity}: java.lang.IllegalArgumentException: Duplicate key in ArrayMap: null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2493)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
at android.app.ActivityThread.access$800(ActivityThread.java:176)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
Caused by: java.lang.IllegalArgumentException: Duplicate key in ArrayMap: null
at android.util.ArrayMap.validate(ArrayMap.java:555)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2486)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelableArrayList(Bundle.java:848)
at android.content.Intent.getParcelableArrayListExtra(Intent.java:5099)
at com.abc.app.activity.FinalActivity.onCreate(FinalActivity.java:60)
at android.app.Activity.performCreate(Activity.java:6005)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2446)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
at android.app.ActivityThread.access$800(ActivityThread.java:176)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
当我改变键值时,我会在日志中看到这一点,同时还会出现空指针异常
02-24 03:01:38.074 32206-32206/com.abc.app W/ArrayMap: New hash 0 is before end of array hash 1374673561 at index 4 key null
java.lang.RuntimeException: here
at android.util.ArrayMap.append(ArrayMap.java:510)
at android.os.Parcel.readArrayMapInternal(Parcel.java:2483)
at android.os.BaseBundle.unparcel(BaseBundle.java:221)
at android.os.Bundle.getParcelableArrayList(Bundle.java:848)
at android.content.Intent.getParcelableArrayListExtra(Intent.java:5099)
at com.abc.app.activity.FinalActivity.onCreate(FinalActivity.java:60)
at android.app.Activity.performCreate(Activity.java:6005)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2446)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2555)
at android.app.ActivityThread.access$800(ActivityThread.java:176)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1437)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
我的Parcelable类出了点问题。我重新制作了它,现在它工作得很好。
在我的例子中,我在实现
Parcelable
的类模型的
writeToParcel
方法中编写了两次相同的键。所以当从Bundle中保存/检索它时,它抛出了错误。
错误的代码:
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(feature_id);
dest.writeString(tab_custom_name);
dest.writeString(sort_order);
dest.writeString(tab_logo_selected_image);
dest.writeString(tab_logo_unselected_image);
dest.writeString(tab_logo_unselected_image);
所以,我删除了最后写的两行中的一行。之后就没有错误了。
在我的例子中,因为服务器语言是php,并且它返回的json字符串不是代码示例,字段‘standard.For’可以是字符串,也可以是int,所以当类实现Parcelable时,我定义了‘
Object code
’为这个代码类型,你必须指定字段类型,否则,你会收到这个错误。
此外,我解决方案是定义字段'localCode‘来使用并打包它。当我获得服务器返回数据时,我设置了'localCode’字段。
当然,最好的解决方案是确保服务器返回标准的json。
Write to Parcelable和read from Parcelable的顺序应该是相同的。或者你把null放在额外值中。
在我的例子中,我有两个不同的类构造函数来实现Parcelable,并使用集成开发环境生成
@Override writeToParcel and read parcel
方法,它们具有不同数量的参数。因此,我通过使用相同的参数(相同的编号、类型和顺序)删除了额外的参数来修复问题,请参阅代码中注释的部分。
public class MediaChannel implements Parcelable {
String name;
String url;
String supportDevice;
String process;
String line;
String icon;
// movies extra fields
String imagePath;
String category;
String duration;
String title;
String description;
String actors;
String years;
String imdb;
public MediaChannel(String name, String url, String process, String icon, String imagePath, String category, String duration, String title, String description, String actors, String years, String imdb) {
this.name = name;
this.url = url;
this.process = process;
this.icon = icon;
this.imagePath = imagePath;
this.category = category;
this.duration = duration;
this.title = title;
this.description = description;
this.actors = actors;
this.years = years;
this.imdb = imdb;
public MediaChannel(String name, String url, String supportDevice, String process, String line) {
this.name = name;
this.url = url;
this.supportDevice = supportDevice;
this.process = process;
this.line = line;
protected MediaChannel(Parcel in) {
name = in.readString();
url = in.readString();
supportDevice = in.readString();
process = in.readString();
line = in.readString();
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(url);
dest.writeString(supportDevice);
dest.writeString(process);
dest.writeString(line);
// deleted this part to fix the issues
dest.writeString(icon);
dest.writeString(imagePath);
dest.writeString(category);
dest.writeString(duration);
dest.writeString(title);
dest.writeString(description);