java - Android:错误/AndroidRuntime(1389):致命异常:Thread-99,java.lang.NullPointerException

标签 java android multithreading

在我的应用程序中,我有“MyService”类,它会从手机中的某些数据进行备份,并且这是在 run() 的线程中。在另一个类上我也有这个:

public static final Parcelable.Creator<ParentActivityData> CREATOR = new Creator<ParentActivityData>() {
    @Override
    public ParentActivityData createFromParcel(Parcel parcel) {
        return null;
    } 

我不在任何地方使用它,当我按下备份按钮时,我收到此错误:

ERROR/AndroidRuntime(1389): FATAL EXCEPTION: Thread-99
        java.lang.NullPointerException
        at com.---.---.MyService$1.run(MyService.java:51)

我该如何解决这个问题???

编辑:

package com.athena.paadbox.entity;

import android.os.Parcel;
import android.os.Parcelable;

import java.util.HashMap;
import java.util.List;

public class ParentActivityData implements Parcelable {
    public List<SelectableEntity> listDataHeader;
    public HashMap<String, List<SelectableEntity>> listDataChild;

    public static final Parcelable.Creator<ParentActivityData> CREATOR = new Creator<ParentActivityData>() {
        @Override
        public ParentActivityData createFromParcel(Parcel parcel) {
            ParentActivityData pad = new ParentActivityData();
            return pad;
        }

        @Override
        public ParentActivityData[] newArray(int i) {
            return new ParentActivityData[0];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
    }
}

编辑:

public class SelectableEntity implements Parcelable {
    public SelectableEntity parent = null;
    public String title = null;
    public boolean state = false;

    public SelectableEntity(String title) {
        this.title = title;
    }

    public SelectableEntity(SelectableEntity parent, String title) {
        this.parent = parent;
        this.title = title;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
    }
}

最佳答案

试试这个...

public class ParentActivityData implements Parcelable {
    public List<SelectableEntity> listDataHeader;
    public HashMap<String, List<SelectableEntity>> listDataChild;

    public ParentActivityData() {

    }

    private ParentActivityData(Parcel parcel) {
        listDataHeader = (List<SelectableEntity>) parcel.readValue(getClass().getClassLoader());
        listDataChild = (HashMap<String, List<SelectableEntity>>) parcel.readValue(getClass().getClassLoader());
    }

    public static final Parcelable.Creator<ParentActivityData> CREATOR = new Parcelable.Creator<ParentActivityData>() {
        @Override
        public ParentActivityData createFromParcel(Parcel parcel) {
            return new ParentActivityData(parcel);
        }

        @Override
        public ParentActivityData[] newArray(int size) {
            return new ParentActivityData[size];
        }
    };

    @Override
    public int describeContents() {
        return 0xFEED;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeValue(listDataHeader);
        parcel.writeValue(listDataChild);
    }
}


public class SelectableEntity implements Parcelable {
    public SelectableEntity parent = null;
    public String title = null;
    public boolean state = false;
    // Don't use these constructors.
    /*public SelectableEntity(String title) {
        this.title = title;
    }

    public SelectableEntity(SelectableEntity parent, String title) {
        this.parent = parent;
        this.title = title;
    }*/

    public SelectableEntity() {

    }

    // use setters

    public void setParent(SelectableEntity parent) {
        this.parent = parent;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public void setState(boolean state) {
        this.state = state;
    }

    private SelectableEntity(Parcel parcel) {
        parent = parcel.readParcelable(getClass().getClassLoader());
        title = parcel.readString();
        state = (Boolean) parcel.readValue(getClass().getClassLoader());
    }

    @Override
    public int describeContents() {
        return 0xFEED;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeParcelable(parent, flags);
        parcel.writeString(title);
        parcel.writeValue((Boolean)state);
    }

    public static final Parcelable.Creator<SelectableEntity> CREATOR = new Parcelable.Creator<MainActivity.SelectableEntity>() {

        @Override
        public SelectableEntity createFromParcel(Parcel source) {
            return new SelectableEntity(source);
        }

        @Override
        public SelectableEntity[] newArray(int size) {
            return new SelectableEntity[size];
        }
    };
}

为此,您的 SelectableEntity 类还必须实现 Parcelable,才能正常工作。

关于java - Android:错误/AndroidRuntime(1389):致命异常:Thread-99,java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20627133/

相关文章:

c# - 队列竞争条件

java - 异步和同步模式的并发

java - 从 Java 代码访问 Scala 对象

Java <Streams> 如何根据列表组件的数量对我的对象列表进行排序

JavaFX 资源处理 : Load HTML files in WebView

android - 广播接收器 - 使用一个比使用多个更好吗?

android - Android 上的方法 glFrustumf()

c - GTK 3 线程管理

java - 如何在不导入任何 java 库的情况下使直方图更加 OOPy?

Android:媒体播放器因未处理的事件而消失