我的Android类实现Parcelable有什么问题?活动中的NullPointerException?

我的Android类实现Parcelable有什么问题?活动中的NullPointerException?,android,Android,问题如下-我启动活动,当我想要拍摄图像时,我使用startActivityForResult(intent)调用相机(button onclick),并且带有位图的intent返回正常状态,其中我将位图分配给CounterUser对象中的属性(它的类实现了parcelable)最后在ImageView上显示它-这很好..但为了处理方向更改,我在活动中添加了以下代码-这会导致和NullPointerException并关闭活动: 注意-counterObj是实现Parcelable接口的Count

问题如下-我启动活动,当我想要拍摄图像时,我使用startActivityForResult(intent)调用相机(button onclick),并且带有位图的intent返回正常状态,其中我将位图分配给CounterUser对象中的属性(它的类实现了parcelable)最后在ImageView上显示它-这很好..但为了处理方向更改,我在活动中添加了以下代码-这会导致和NullPointerException并关闭活动:

注意-counterObj是实现Parcelable接口的CounterUser类的实例

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putParcelable("counterObj", counterObj);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if(savedInstanceState != null){
    counterObj = savedInstanceState.getParcelable("counterObj");
    counterImgView.setImageBitmap(counterObj.counterImg);
    }   
}
错误:

这是我实现Parcelable接口的类-它还有一个位图属性。。。它使用两个构造函数-在活动中,我使用第一个无参数构造函数为所有实例属性分配空值

public class CounterUser implements Parcelable {


String fname;
String lname;
String adresse;
Integer counterID;
Integer counterValue;
Bitmap counterImg;
Boolean damageExists;
String damageDescript;
//----
Double longitude;
Double latitude;
Integer workerID;
String updateDate;


public CounterUser(){

    this(null,null,null,null,null,null,null,null,null,null,null,null);  
}

public CounterUser(String fname, String lname, String adresse, Integer counterID, Integer counterValue, Bitmap counterImg, Boolean damageExists, 
        String damageDescript, Double longitude, Double latitude, Integer workerID, String updateDate){

    this.fname = fname;
    this.lname = lname;
    this.adresse = adresse;
    this.counterID = counterID;
    this.counterValue = counterValue;
    this.counterImg = counterImg;
    this.damageExists = damageExists;
    this.damageDescript = damageDescript;
    this.longitude = longitude;
    this.latitude = latitude;
    this.workerID = workerID;
    this.updateDate = updateDate;

}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.fname);
    dest.writeString(this.lname);
    dest.writeString(this.adresse);
    dest.writeInt(this.counterID);
    dest.writeInt(this.counterValue);
    //Bitmap je parcelable
    this.counterImg.writeToParcel(dest, flags);

    dest.writeByte((byte) (this.damageExists ? 1 : 0)); 
    dest.writeString(this.damageDescript);
    dest.writeDouble(this.longitude);
    dest.writeDouble(this.latitude);
    dest.writeInt(this.workerID);
    dest.writeString(this.updateDate);

}
public static final Parcelable.Creator<CounterUser> CREATOR = new Parcelable.Creator<CounterUser>() {
    public CounterUser createFromParcel(Parcel in) {
        return new CounterUser(in);
    }

    public CounterUser[] newArray(int size) {
        return new CounterUser[size];
    }
    };

    private CounterUser(Parcel in) {

        this.fname = in.readString();
        this.lname = in.readString();
        this.adresse = in.readString();
        this.counterID = in.readInt();
        this.counterValue = in.readInt();
        //Bitmap je parcelable
        this.counterImg = Bitmap.CREATOR.createFromParcel(in);

        this.damageExists = in.readByte() == 1;
        this.damageDescript = in.readString();
        this.longitude = in.readDouble();
        this.latitude = in.readDouble();
        this.workerID = in.readInt();
        this.updateDate = in.readString();
    }
公共类计数器用户实现可包裹{
字符串fname;
字符串名称;
字符串地址;
整数计数器ID;
整数计数器值;
位图计数器;
布尔损伤存在;
字符串损坏描述;
//----
双经度;
双纬度;
整数workerID;
字符串更新;
公共反用户(){
这(null,null,null,null,null,null,null,null,null,null,null,null,null,null,null);
}
公共计数器用户(字符串fname、字符串lname、字符串地址、整数计数器ID、整数计数器值、位图计数器img、布尔损坏存在、,
字符串损坏描述符,双经度,双纬度,整数workerID,字符串更新日期){
this.fname=fname;
this.lname=lname;
this.adrese=adrese;
this.counterID=counterID;
this.counterValue=counterValue;
this.counterImg=counterImg;
this.damageExists=damageExists;
this.damageDescript=损坏描述;
这个经度=经度;
这个。纬度=纬度;
this.workerID=workerID;
this.updateDate=updateDate;
}
@凌驾
公共int描述符内容(){
返回0;
}
@凌驾
公共无效写入包裹(包裹目的地,内部标志){
dest.writeString(this.fname);
dest.writeString(this.lname);
目的地记录(本地址);
目的写入(此计数器ID);
目的写入(此计数器值);
//位图可包裹
此.计数器写入包裹(目的地,标志);
dest.writeByte((字节)(this.damageExists?1:0));
目的地书面记录(此损坏描述);
目的地可写双倍(此经度);
目标写双倍(此纬度);
dest.writeInt(this.workerID);
dest.writeString(this.updateDate);
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共计数器用户createFromParcel(地块中){
返回新的计数器用户(in);
}
公共计数器用户[]新数组(整数大小){
返回新的计数器用户[大小];
}
};
私人计数器用户(包裹输入){
this.fname=in.readString();
this.lname=in.readString();
this.adresse=in.readString();
this.counterID=in.readInt();
this.counterValue=in.readInt();
//位图可包裹
this.counterImg=Bitmap.CREATOR.createFromParcel(在中);
this.damageExists=in.readByte()==1;
this.damageDescript=in.readString();
this.longitude=in.readDouble();
this.latitude=in.readDouble();
this.workerID=in.readInt();
this.updateDate=in.readString();
}

}

如何创建CounterUser实例?如果使用空的公共构造函数,则会有大量空成员字段,这将导致
writeToParcel
抛出NPE。要么不允许空字段,要么在保存实例时处理它们。

快速查看后,您的默认构造函数似乎将每个属性都设置为空。所以计数器img为null,而不是位图。因此,您正在尝试调用不存在的writeToParcel函数null。CounterUser.java第58行中的某些内容为null。是的,我正在onCreate()中创建一个CounterUser实例,该实例的构造函数为空,这意味着该实例的所有字段都将被赋值为null……因为该活动的形式是……editText,image,firsname等,复选框…因此,当用户在edittext中输入某个内容时,它会将该值分配给相应的实例属性(counterObj.fname=“Mark”)等…但是我应该如何绕过CounterUser for Bitmaps字段的非空实例属性,etc-或者在某些情况下,用户不输入值,counterObj的属性将为null。或者更好的问题是,如果我允许null字段,那么在onSaveInstanceState(Bundle outState)中保存实例时,或者当我通过intent将实例发送到其他活动时,我应该如何处理它们感谢帖子:“在活动中,我使用第一个无参数构造函数为所有实例属性分配空值。”这很可能是尝试将位图对象写入包。是的,我正在onCreate()中创建CounterUser的实例使用空构造函数意味着实例的所有字段都将被赋值为NULL…因为活动的形式是…editText、image、firsname等,复选框…所以当用户在editText中输入某个内容时,它会将该值赋给相应的实例属性(counterObj.fname=“Mark”),等等…但是我应该如何避免位图字段等的CounterUser的非null实例属性?或者在某些情况下,用户不输入值,counterObj的属性将为null。或者更好的问题是,如果我允许null字段,那么在onSaveInstanceState(Bundle outState)中保存实例时应该如何处理它们或者当我通过intent将实例发送到其他活动时?-thanks@Matt. 我错过了那份声明。自我提示:在回答之前,阅读整篇文章。但是,它可以是任何领域,真的。抱歉,我对这个API了解得不够详细,无法回答如何处理空字段,b