另一个 Null 对象引用

Another Null object reference

我是新手,虽然我已经通读了网站上的类似主题,但似乎找不到错误。我了解错误的要点,但似乎无法解决。我正在为项目制作一个基本的“购物车”,并希望通过 RecycleView 中的 onClickListener 将项目从自定义 ArrayList 传递到另一个自定义 ArrayList。 .我有一种感觉,它与“位置”有关,因为它是相关代码行之间唯一的公共元素。我已经标记了错误消息中出现的三行。

        public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private MainAdapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    private ArrayList<Inventory> mInventoryList;
    private int position;


    private Button button;
    private ArrayList<Inventory> cartList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new Estimate("XXX000","John Smith", "john@gmail.com", cartList);


        InputStream inputStream = getResources().openRawResource(R.raw.data);
        CSVreader csvFile = new CSVreader(inputStream);
        ArrayList<Inventory> inventoryList = (ArrayList<Inventory>) csvFile.read();

        mRecyclerView = findViewById(R.id.recyclerviewMain);
        mRecyclerView.setHasFixedSize(true);   
        mLayoutManager = new LinearLayoutManager(this);
        mAdapter = new MainAdapter(inventoryList); 
        mInventoryList = inventoryList;

        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);

        button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                    Intent intent = new Intent(v.getContext(), EstimateActivity.class);
                    intent.putExtra("cartList", cartList); 
                    v.getContext().startActivity(intent);
            }
        });



        mAdapter.setOnItemClickListener(new MainAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {
                addToCart(position); //ERROR HERE
            }
        });
    }

    public void addToCart(int position){

        cartList.add(position, new Inventory()); //ERROR HERE
    }


}
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
    private ArrayList<Inventory> mInventoryList;
    private ArrayList<Inventory> mCartList;
    private OnItemClickListener mListener;


    public interface OnItemClickListener {
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }


    public static class MainViewHolder extends RecyclerView.ViewHolder {
        private TextView cardCode;
        private TextView cardName;
        private CardView containerView;
        private ArrayList<Inventory> cartList;


        public MainViewHolder(View itemView, final OnItemClickListener listener) {
            super(itemView);

            cardCode = itemView.findViewById(R.id.text_row_code_viewMain);
            cardName = itemView.findViewById(R.id.text_row_name_viewMain);
            itemView = itemView.findViewById(R.id.container_viewMain);



            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null ){
                        int position = getAdapterPosition(); //ERROR HERE
                        if (position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);  
                        }
                    }
                }
            });

        }
    }

    public MainAdapter(ArrayList<Inventory> inventoryList){   
        mInventoryList = inventoryList;

    }

    @NonNull
    @Override
    public MainViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.text_row_main, parent, false);
       MainViewHolder mvh = new MainViewHolder(view, mListener);
       return mvh;
    }

    @Override
    public void onBindViewHolder(@NonNull MainViewHolder holder, int position) {
        Inventory currentItem = mInventoryList.get(position);
        holder.cardName.setText(currentItem.getName());
        holder.cardCode.setText(currentItem.getCode());
        holder.itemView.setTag(currentItem);

    }



    @Override
    public int getItemCount() {
        return mInventoryList.size();
    }
}
    11357/com.jourdon.cartsavetest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jourdon.cartsavetest, PID: 11357
java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.add(int, java.lang.Object)' on a null object reference
    at com.jourdon.cartsavetest.MainActivity.addToCart(MainActivity.java:76)
    at com.jourdon.cartsavetest.MainActivity.onItemClick(MainActivity.java:69)
    at com.jourdon.cartsavetest.MainAdapter$MainViewHolder.onClick(MainAdapter.java:49)
    at android.view.View.performClick(View.java:7448)
    at android.view.View.performClickInternal(View.java:7425)
    at android.view.View.access00(View.java:810)
    at android.view.View$PerformClick.run(View.java:28305)
    at android.os.Handler.handleCallback(Handler.java:938)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:223)
    at android.app.ActivityThread.main(ActivityThread.java:7656)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

2020-11-04 17:51:47.720 11357-11357/? I/Process:发送信号。 PID:11357 SIG:9


只需声明您的变量 cartList,您在这一行所做的:

     private ArrayList<Inventory> cartList;

还不够。您还需要使用可以添加项目的实际列表初始化此变量。

当你声明一个变量时,你是在告诉 Java 你计划在你的程序中使用一个特定类型的对象,并且你是在告诉 Java 变量的名称是什么与类型一起。

但是,声明变量并不能为您提供实际列表。您需要做的是创建一个列表并将其存储在您的变量中。您可能想在 MainViewHolder 构造函数方法中执行此操作。初始化行可能如下所示:

 cartList = new ArrayList<Inventory>();