代码之家  ›  专栏  ›  技术社区  ›  Jepoy

java.lang.ClassCastException:实现Parcelable时不能将java.lang.String强制转换为

  •  0
  • Jepoy  · 技术社区  · 7 年前

    对于为什么我的parcelable实现会抛出classcastexception,我已经没有什么想法了。我想知道为什么会抛出异常,并想办法解决它。请让我知道,如果我仍然缺乏信息,以便你们帮助我。

    IDModelDTO类

    public class IdModelDTO implements Parcelable {
    private String type;
    private String surname;
    private String givenName;
    private String middleName;
    private String birthDate;
    
    protected IdModelDTO(Parcel in) {
        givenName = in.readString();
        middleName = in.readString();
        surname = in.readString();
        birthDate = in.readString();
        type = in.readString();
    } 
    public static final Creator<IdModelDTO> CREATOR = new Creator<IdModelDTO(){
        @Override
        public IdModelDTO createFromParcel(Parcel in) {
            return new IdModelDTO(in);
        }
    
        @Override
        public IdModelDTO[] newArray(int size) {
            return new IdModelDTO[size];
        }
    };
    
    @Override
    public int describeContents() {
        return 0;
    }
    
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(givenName);
        dest.writeString(middleName);
        dest.writeString(surname);
        dest.writeString(birthDate);
        dest.writeString(type);
    }
    
    @Override
    public String toString() {
        return "IdModelDTO{" + "givenName='" + givenName + '\''
                + ", middleName='" + middleName + '\'' +
                "surname='" + surname + '\'' +
                "birthdate=''" + birthDate + '\'' +
                "type='" + type +  '\'' + '}';
    }
    

    这就是我用来打包的地方。在发送到下一个活动之前,我甚至可以将其作为一个包进行记录:

    public void checkMplusRespCodes() {
            // Check if response codes are OK/Created:
            if(governmentIdRespCode == null){
                Log.d(TAG, "Government Id Response code: " + governmentIdRespCode );
            }
            if(saveSelfieResponse == null){
                Log.d(TAG, "saveSelfieResponse: " + saveSelfieResponse);
            }
            else if(governmentIdRespCode != null && saveSelfieResponse != null){
                if(governmentIdRespCode.equals("200") && saveSelfieResponse.equals("200")){
                    //Create bundle here, then pass it to view:
                    //Bundle idModelBundle = new Bundle();
                    //idModelBundle.putParcelable(THISIDMODEL, thisIdModel);
                    //viewContract.showNextActivity(idModelBundle);
                    Log.d(TAG, " checkMplusRespCodes: " + idModelDTO.toString());
                    Bundle idModelBundle = new Bundle();
                    idModelBundle.putParcelable(THISIDMODEL, idModelDTO);
                    viewContract.showDoneLoading();
                    viewContract.showNextActivity(idModelBundle);
                }
            }
    

    然后在NextActivity中,它抛出ClassCastException:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);
        /* */
        Intent previousIntent = getIntent();
        if(previousIntent.getExtras() != null){
            Bundle previousExtras = previousIntent.getExtras();
            if(previousExtras != null){
                IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);
                if(test != null){
                    Log.d(TAG, " asd: " + test.toString());
                }
                /* Retrieve: */
            }
        }else{
            //proceed.
        }
    

    任何帮助都将不胜感激。

    编辑: 这是该方法的日志,而我将Parcelable对象设置为一个包:

    checkMplusRespCodes: IdModelDTO{givenName='test', middleName='asd'surname='Test'birthdate=''axx'type='asxd'}
    

    异常发生在下一个活动中,在该活动中它被投射:

    IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   Milan Pansuriya    7 年前

    用这个替换你的代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test1);
        /* */
        Intent previousIntent = getIntent();
        if(previousIntent.getExtras() != null){
            Bundle previousExtras = previousIntent.getExtras();
            if(previousExtras != null){
                IdModelDTO test = previousExtras.getParcelable(THISIDMODEL);
                if(test != null){
                    Log.d(TAG, " asd: " + test.toString());
                }
                /* Retrieve: */
            }
        }else{
            //proceed.
        }
    
        2
  •  0
  •   Jepoy    7 年前

    好吧,我解决了。我正在将一个bundle对象转换到我的自定义idmodeldto中,如您在这行中看到的:

    if(previousExtras != null){
            IdModelDTO test = previousIntent.getParcelableExtra(THISIDMODEL);
            ...
    

    我删除了将对象放在包中的包部分,并使用puttera以便能够检索对象的类型:

    Intent nextActivityIntent = new Intent(this, TestActivityX.class);
    nextActivityIntent.putExtra(THISIDMODEL,idModelDTO);
    Log.d(TAG, " Show next activity: " + idModelDTO.toString());
    startActivity(nextActivityIntent);
    

    然后检索将用于下一个活动:

    Intent previousIntent = getIntent();
        if (previousIntent.getExtras() != null) {
            Bundle previousExtras = previousIntent.getExtras();
            if (previousExtras != null) {
                // Retrieve:
                if (previousExtras.containsKey(THISIDMODEL)) {
                    // Re-instanciate new user.
                    IdModelDTO test = previousExtras.getParcelable(THISIDMODEL);
                    Log.d(TAG, " Previous Details:" + test.toString());
                }
            }
        }
    

    谢谢各位,我真的很感谢你们的评论。

        3
  •  0
  •   Mahesh Babariya    7 年前

    我想你在分析 date 不是 String .

    这就是为什么你会有这个例外。