java - 尝试在 Cast.writetoParcel 的空对象引用上调用虚拟方法 'int.java.lang.Integer.intValue()'

标签 java android arraylist android-recyclerview

<分区>

Error Image

Getting Error FATAL EXCEPTION: main Process: com.example.wuntu.tv_bucket, PID: 3895 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference at com.example.wuntu.tv_bucket.Models.Cast.writeToParcel(Cast.java:136) at android.os.Parcel.writeParcelable(Parcel.java:1437) at android.os.Parcel.writeValue(Parcel.java:1343) at android.os.Parcel.writeList(Parcel.java:759) at android.os.Parcel.writeValue(Parcel.java:1365) at android.os.Parcel.writeArrayMapInternal(Parcel.java:686) at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330) at android.os.Bundle.writeToParcel(Bundle.java:1079) at android.os.Parcel.writeBundle(Parcel.java:711) at android.content.Intent.writeToParcel(Intent.java:8790) at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3112) at android.app.Instrumentation.execStartActivity(Instrumentation.java:1541) at android.app.Activity.startActivityForResult(Activity.java:4284) at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) at android.app.Activity.startActivityForResult(Activity.java:4231) at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) at android.app.Activity.startActivity(Activity.java:4568) at android.app.Activity.startActivity(Activity.java:4536) at com.example.wuntu.tv_bucket.Adapters.CastDetailAdapter$1.onClick(CastDetailAdapter.java:124) at android.view.View.performClick(View.java:5698) at android.widget.TextView.performClick(TextView.java:10908) at android.view.View$PerformClick.run(View.java:22557) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7231) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

从适配器向其他 Activity 发送对象的 arraylist 时出错。我想将我的 arraylist 从适配器的 onBindViewHolder 方法发送到另一个 Activity ,但它在 writetoParcel 方法的 Cast 类上显示空异常错误。如何正确发送arraylist

Actor 类(class)

public class Cast implements Parcelable {

    @SerializedName("cast_id")
    @Expose
    private Integer castId;
    @SerializedName("character")
    @Expose
    private String character;
    @SerializedName("credit_id")
    @Expose
    private String creditId;
    @SerializedName("gender")
    @Expose
    private Integer gender;
    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("order")
    @Expose
    private Integer order;
    @SerializedName("profile_path")
    @Expose
    private String profilePath;

    public Cast(){

    }

    protected Cast(Parcel in) {
        character = in.readString();
        id = in.readInt();
        name = in.readString();
        profilePath = in.readString();
    }

    public static final Creator<Cast> CREATOR = new Creator<Cast>() {
        @Override
        public Cast createFromParcel(Parcel in) {
            return new Cast(in);
        }

        @Override
        public Cast[] newArray(int size) {
            return new Cast[size];
        }
    };

    public Integer getCastId() {
        return castId;
    }

    public void setCastId(Integer castId) {
        this.castId = castId;
    }

    public String getCharacter() {
        return character;
    }

    public void setCharacter(String character) {
        this.character = character;
    }

    public String getCreditId() {
        return creditId;
    }

    public void setCreditId(String creditId) {
        this.creditId = creditId;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getOrder() {
        return order;
    }

    public void setOrder(Integer order) {
        this.order = order;
    }

    public String getProfilePath() {
        return profilePath;
    }

    public void setProfilePath(String profilePath) {
        this.profilePath = profilePath;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int i)
    {
        parcel.writeString(name);
        parcel.writeString(profilePath);
        parcel.writeString(character);
        parcel.writeInt(id);
    }
}

CastDetailAdapter 类

public class CastDetailAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private ArrayList<Cast> detailArrayList = new ArrayList<>() ;
    private UrlConstants urlConstants = UrlConstants.getSingletonRef();
    private Cast cast;
    private final int VIEW_ITEM = 0;
    private final int VIEW_PROG = 1;
    private Context context;
    MovieView a;
    ArrayList<Cast> FullArrayList = new ArrayList<>();

    public CastDetailAdapter(MovieView movieView, ArrayList<Cast> detailArrayList,ArrayList<Cast> subCastArrayList)
    {
        a = movieView;
        this.detailArrayList = subCastArrayList;
        this.FullArrayList = detailArrayList;
    }


    public class MyViewHolder1 extends RecyclerView.ViewHolder
    {
        ImageView cast_profile_picture;
        TextView cast_name,cast_character_name;

        public MyViewHolder1(View view)
        {
            super(view);
            cast_profile_picture = (ImageView) view.findViewById(R.id.thumbnail);
            cast_name = (TextView) view.findViewById(R.id.title);
            cast_character_name = (TextView) view.findViewById(R.id.count);
        }
    }

    public class FooterViewHolder1 extends RecyclerView.ViewHolder
    {
        TextView view_more;

        public FooterViewHolder1(View itemView) {
            super(itemView);
            view_more = (TextView) itemView.findViewById(R.id.view_more);


        }
    }

    @Override
    public int getItemViewType(int position) {
        if (isPositionItem(position))
            return VIEW_ITEM;
        return VIEW_PROG;
    }

    private boolean isPositionItem(int position) {
        return position != getItemCount() -1;
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
    {
        context = parent.getContext();

        if (viewType == VIEW_ITEM)
        {
            View v =  LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cast_details, parent, false);
            return new MyViewHolder1(v);

        } else if (viewType == VIEW_PROG){
            View v = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.footer_layout_movie_details, parent, false);
            return new FooterViewHolder1(v);
        }
        return null;

    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)
    {
        if(holder instanceof MyViewHolder1)
        {
            cast = detailArrayList.get(position);
            ((MyViewHolder1)holder).cast_character_name.setText(cast.getCharacter());
            ((MyViewHolder1)holder).cast_name.setText(cast.getName());
            String url3 = urlConstants.URL_Image + cast.getProfilePath();
            Picasso.with(context)
                    .load(url3)
                    .into(((MyViewHolder1)holder).cast_profile_picture);
        }
        else if (holder instanceof FooterViewHolder1)
        {
            ((FooterViewHolder1)holder).view_more.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view)
                {
                    Intent intent = new Intent(context,CastViewActivity.class);
                    intent.putParcelableArrayListExtra("LIST",FullArrayList);
                    context.startActivity(intent);
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return this.detailArrayList.size();
    }
}

最佳答案

在您的writeToParcel() 方法中,您有

parcel.writeInt(id);

由于 idInteger,这将自动拆箱 id。如果 id 为 null,此自动拆箱将抛出 NullPointerException

由于没有 Parcel.writeInteger() 方法,您将不得不在单独的写入中记录 id 是否为 null。像这样的东西:

if (id == null) {
    dest.writeInt(0);
}
else {
    dest.writeInt(1);
    dest.writeInt(id);
}

并读回:

int hasId = in.readInt();

if (hasId == 1) {
    id = in.readInt();
}
else {
    id = null;
}

关于java - 尝试在 Cast.writetoParcel 的空对象引用上调用虚拟方法 'int.java.lang.Integer.intValue()',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45308126/

相关文章:

java - 带时间戳的 JSF

java - 如何在Spring集成中从数据库读取配置适配器?

java - 在 Android 应用发送的 HTTP 请求之间维护 cookie

android - 如何在 osx 中挂载 userdata.img 或 userdata-qemu.img

java - 使用列表获取匹配项索引的有效方法

Java ArrayList,抽象类返回ArrayList的访问方法

java - 连接 modelica 模型和 Java 模型

java - 将文档根节点与前缀匹配

android - FLAG_ACTIVITY_REORDER_TO_TOP 导致 RuntimeException 或旋转黑屏

java - 如何快速方便地创建单元素数组列表