Getting NullPointerException: Versuch, die Länge des Null-Arrays in Parcelable abzurufen, wenn versucht wird, ein Byte-Array in Android zu lesen

Ich habe eine Klasse, die das Parcelable implementiert. Alle meine Werte werden durch die writeToParcel-Methode in Ordnung gesetzt, aber beim Lesen im Konstruktor habe ich ein Problem mit einem Byte-Array, das eine NullPointerException auslöst:

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;
    }
}

so ist mir aufgefallen, dass das Bytearray vor dem Lesen nicht initialisiert wird, und ich initialisiere es dann, indem ich den Konstruktor folgendermaßen ändere:

    public Product(Parcel source) {
        this.ID = source.readInt();

        this.image = new byte[source.readInt()];
        source.readByteArray(this.image);
    }

und jetzt bekomme ich noch einen Fehler:

Caused by: java.lang.NullPointerException: Attempt to get length of null array

Also, was mache ich falsch?

Anyway, ich verstehe nicht, warum ich das Byte-Array beim Lesen initialisieren muss, wenn writeToParcel zuerst aufgerufen wird, und dem Byte-Array einen Wert zuweisen muss, sodass ich beim Lesen nur den von WriteToParcel geschriebenen Wert vom Konstruktor erhalten möchte ... Könnte jemand erkläre mir das bitte auch Vielleicht verstehe ich Parcelable Objekt überhaupt nicht ...

Gelöst von:

In schreiben ...

    dest.writeInt(this.image.length);
    dest.writeByteArray(this.image);

In read ...

    this.image = new byte[source.readInt()];
    source.readByteArray(this.image);

Antworten auf die Frage(0)

Ihre Antwort auf die Frage