Получение NullPointerException: попытка получить длину нулевого массива в Parcelable при попытке прочитать байтовый массив в Android
У меня есть класс, который реализует Parcelable. Все мои значения устанавливаются нормально с помощью метода writeToParcel, но при чтении в конструкторе у меня возникает проблема с байтовым массивом, который генерирует исключение NullPointerException:
public final class Product implements Parcelable {
private Integer ID;
private byte[] image;
// Constructors
public Product(){}
public Product(Parcel source) {
this.ID = source.readInt();
source.readByteArray(this.image);
}
public int describeContents() {
return this.hashCode();
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.ID);
dest.writeByteArray(this.image);
}
public static final Parcelable.Creator<Product> CREATOR
= new Parcelable.Creator<Product>() {
public Product createFromParcel(Parcel in) {
return new Product(in);
}
public Product[] newArray(int size) {
return new Product[size];
}
};
// Getters
public Integer getID () {
return this.ID;
}
public byte[] getImage() {
return this.image;
}
// Setters
public void setID (Integer id) { this.ID = id; }
public void setImage(byte[] image) {
this.image = image;
}
}
поэтому я заметил, что байтовый массив не инициализируется перед чтением, а затем я инициализирую его, модифицируя конструктор следующим образом:
public Product(Parcel source) {
this.ID = source.readInt();
this.image = new byte[source.readInt()];
source.readByteArray(this.image);
}
и теперь я получаю эту еще одну ошибку:
Caused by: java.lang.NullPointerException: Attempt to get length of null array
Так что я делаю не так?
Во всяком случае, я не понимаю, почему я должен инициализировать массив байтов при чтении, так как сначала вызывается writeToParcel, и присваивать значение байтовому массиву, поэтому при чтении я хочу получить только значение, записанное WriteToParcel, из конструктора ... Может кто-нибудь объяснить мне это тоже, пожалуйста? Может быть, я не понимаю, Parcelable объект вообще
РЕШЕНО:
В записи ...
dest.writeInt(this.image.length);
dest.writeByteArray(this.image);
В чтении ...
this.image = new byte[source.readInt()];
source.readByteArray(this.image);