1

そのため、StackOverFlowを調べていましたが、問題を完全に解決するトピックが見つからないようです。カスタムパーセル可能ファイルを使用しようとしているときに、多くの人がNullPointerExceptionsで問題を抱えています。パーセル可能なクラスのCREATORにStaticを追加するだけの簡単なソリューションで問題が解決されるのを見てきました。しかし、私は自分の大義を助けるものや、自分の状況について何らかの啓蒙を行うものを見つけられませんでした。

MyPointsListというカスタムクラスから座標のArrayListにアクセスすると、NullPointerExceptionが発生します。MyPointsListを渡す前に、MyPointsList内のArrayListにアクセスできます。インスタンスを取得したら、インスタンスがnullでないことを確認するための簡単なチェックを行い、nullでないことを確認してから、ArrayListにアクセスし、NullPointerExceptionを取得します。

MyPointsList内のArrayListにアクセスするときに、受信クラスでnullポインター例外を受信するのはなぜですか?

以下は、次のクラスのコードです。

MyPoint.java

public class MyPoint implements Parcelable {
    private int x;
    private int y;

    public MyPoint(){
        this.x = 0;
        this.y = 0;
    }

    public MyPoint(Parcel in){
        this.x = 0;
        this.y = 0;
        readFromParcel(in);
    }

    public void setPoint(int px, int py){
        this.x = px;
        this.y = py;
    }

    public int getX(){return this.x;}

    public int getY(){return this.y;}

    public static final Parcelable.Creator <MyPoint> CREATOR = new Parcelable.Creator <MyPoint> (){
        public MyPoint createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            return new MyPoint(source);
        }

        public MyPoint[] newArray(int size) {
            // TODO Auto-generated method stub
            return new MyPoint[size];
        }       
    };

    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(x);
        dest.writeInt(y);

    }

public void readFromParcel(Parcel in){
        int count = in.dataAvail();
        for(int i = 0; i < count; i++){
            x = in.readInt();
            i++;
            y = in.readInt();
        }
    }
}

MyPointsList.java

public class MyPointsList implements Parcelable {

    private ArrayList<MyPoint> arrList = new ArrayList<MyPoint>();
    private int myInt = 0;
    private String myString = null;

    public String getString(){return myString;}

    public void setString(String str){this.myString = str;}

    public MyPoint getMyPoint(int index){return this.arrList.get(index);}

    public ArrayList<MyPoint> getArrayList(){return arrList;}

    public void setArrayList(ArrayList<MyPoint> arr){this.arrList = arr;}

    public int getMyInt(){return myInt;}

    public void setMyInt(int newInt){this.myInt = newInt;}

    MyPointsList(){this.arrList = new ArrayList<MyPoint>();}

    public MyPointsList(Parcel in){
        myInt = in.readInt();
        myString = in.readString();
        arrList = new ArrayList<MyPoint>();
        in.readTypedList(arrList, MyPoint.CREATOR);
    }

    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    public void writeToParcel(Parcel out, int flags) {
        // TODO Auto-generated method stub
        out.writeInt(myInt);
        out.writeString(myString);
        out.writeTypedList(arrList);
    }

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

        public MyPointsList createFromParcel(Parcel source) {
            // TODO Auto-generated method stub
            return new MyPointsList(source);
        }

        public MyPointsList[] newArray(int size) {
            // TODO Auto-generated method stub
            return new MyPointsList[size];
        }   
    };
}

パッケージングセグメント:pointsはMyPointsのArrayListです

public void onClick(View v){
    MyPointsList object = new MyPointsList();
        object.setMyInt(100);
        object.setArrayList(points);
        Log.d("DEBUG", object.getMyPoint(5).getX() + " " + object.getMyPoint(5).getY() + " ");
        Intent goBack = new Intent(SignHereActivity.this, Menu.class);
        goBack.putExtra("parcel" , object);             
        SignHereActivity.this.startActivity(goBack);
    }
});

セグメントの取得

public void getIntentData(){
    Intent i = this.getIntent();
    if(i.hasExtra("parcel")){
        Bundle b = getIntent().getExtras();
        object = b.getParcelable("parcel");
        Log.d("Debug", object.getArrayList().get(5).getX() + " " + object.getArrayList().get(5).getY());
    }
}

すでに述べたように、私は自分の問題に関連して見つけたあらゆる情報を閲覧してきました。ご意見・ご感想をお待ちしております。コード内の構文が煩わしい、またはセグメントが混乱していることをお詫びします。私はまだJavaとAndroid全体に慣れていません。

ありがとう!

4

1 に答える 1

0

私はダミーのように感じますが、他の誰かがこれに遭遇した場合、これが解決策です.

MyPoint から削除:

public void readFromParcel(Parcel in){
    int count = in.dataAvail();
    for(int i = 0; i < count; i++){
        x = in.readInt();
        i++;
        y = in.readInt();
    }
}

MyPoint に挿入:

public void readFromParcel(Parcel in){
    x = in.readInt();
    y = in.readInt();
}

それでおしまい。

于 2013-01-07T17:37:36.303 に答える