1

所以我一直在尋找通過StackOverFlow,似乎無法找到完全解決我的問題的主題。許多人在嘗試使用自定義的可分類時遇到了空指針異常的問題。我已經看到解決方案的問題就像在parcelable類中爲CREATOR添加Static一樣簡單。但是,我沒有找到任何有助於我的事業或對我的情況有所啓​​發的事情。檢索自定義包裹時的空指針異常

從一個名爲MyPointsList的自定義類訪問座標的ArrayList時,我得到一個空指針異常。在傳遞MyPointsList之前,我能夠訪問MyPointsList中的ArrayList。在檢索實例時,我做了一個快速檢查以確保實例不是空的,它不是,然後繼續訪問ArrayList,在那裏我得到空指針異常。

爲什麼在訪問MyPointsList內的ArrayList時在接收類中收到空指針異常?

下面是以下類的代碼:

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

包裝領域:點被MyPoints

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); 
    } 
}); 
的ArrayList

Retreiving段

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的新手。

謝謝!

回答

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

就是這樣。

+0

我通過將他在問題中的解決方案移到這個答案來解決答案,這個答案基本上是「我解決了它」後。 –