Parcelable — ArrayList Исключение NullPointerException

#java #android #parcelable

#java #Android #parcelable

Вопрос:

Я делаю свой объект parcelable, чтобы я мог использовать его с Intent s. Я получаю NullPointerException сообщение, когда после получения я читаю содержимое своего объекта. Наиболее точно соответствует содержимому моего ArrayList<String> . При переборе my ArrayList<String> он имеет null значение во всех позициях, следовательно, my NullPointerException .

Вот мой Parcelable класс:

 public class PhoneBackup implements Parcelable{

public Integer id;
public Long ts;
public String device_name;
public String device_manufacturer;
public String device_model;
public Integer backup_contacts_count;
public String description;
public ArrayList<String> backup_contacts;

public PhoneBackup()
{

}


public PhoneBackup(Parcel pc){
//      backup_contacts = new ArrayList<String>(); // Tried this way, still NPE

    id = pc.readInt();
    ts =  pc.readLong();
    device_name = pc.readString();
    device_manufacturer = pc.readString();
    device_model = pc.readString();
    backup_contacts_count = pc.readInt();
    description = pc.readString();
//      pc.readStringList(backup_contacts); // Tried this way, still NPE
    backup_contacts = pc.createStringArrayList();
}

// (getters and setters)

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(id);
    dest.writeLong(ts);
    dest.writeString(device_name);
    dest.writeString(device_manufacturer);
    dest.writeString(device_model);
    dest.writeInt(backup_contacts_count);
    dest.writeString(description);
    dest.writeList(backup_contacts);

}

/** Static field used to regenerate object, individually or as arrays */
public static final Parcelable.Creator<PhoneBackup> CREATOR = new Parcelable.Creator<PhoneBackup>() {
    public PhoneBackup createFromParcel(Parcel pc) {
        return new PhoneBackup(pc);
    }
    public PhoneBackup[] newArray(int size) {
        return new PhoneBackup[size];
    }
};
  

Это NullPointerException с моим backup_contacts . Но backup_contacts имеет правильный размер, но содержит все null , и поскольку мне нужно прочитать содержимое backup_contacts using get(position) , я получаю null значение, а не a String .

Вопрос в том, почему Parcelable передаются нулевые значения ArrayList<String> , а не фактические строки? Как я могу это исправить?

Комментарии:

1. ВСЕГДА включайте logcat в свой вопрос, если вы получаете исключения.

2. Я понимаю ваш комментарий, но трассировка стека была бы здесь совершенно бесполезной, поскольку она указывала на мои методы приложения без упоминания PhoneBackup класса, какую часть библиотеки я разработал. Я просто вручную проследил NPE PhoneBackup до нескольких отладок.

Ответ №1:

Чтобы прочитать список, он должен быть

 backup_contacts = new ArrayList<String>();
in.readList(backup_contacts, null);
  

Вот документация.

В документации для createStringArrayList говорится:

Считывает и возвращает новый ArrayList, содержащий строковые объекты, из посылки, которая была записана с помощью writeStringList(Список)

Ответ №2:

Я думаю, что проблема может быть в записи в посылку :

 dest.writeList(backup_contacts);
  

должно быть

 dest.writeStringList(backup_contacts);
  

в API уровня 1 добавлен общедоступный конечный список записей с недействительной записью (List val)

Сгладьте список, содержащий строковые объекты, в посылку, при текущей позиции данных () и растущей емкости данных (), если это необходимо. Позже они могут быть получены с помощью createStringArrayList() или readStringList(список).