首页 > 解决方案 > 如何修复带有房间的片段中的 java.lang.NullPointerException

问题描述

我正在创建一个应用程序,您可以在其中输入存储在房间数据库中的数据,然后显示在 recyclerView 中。但是,我在应该将输入添加到 recyclerView 适配器的代码上不断收到 java.lang.NullPointerException

我已经使用本教程https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#10设置了房间数据库,并稍微更改了代码以适合我自己的使用。我已经看过什么是 NullPointerException 以及如何解决这个问题?并了解了错误的含义,但我不明白如何特别为我的代码解决它(对不起,我仍然是 android studio 的初学者)

输入.java


    public static final String EXTRA_REPLY = "com.example.android.mysugartrackersql.REPLY";
    private EditText mEditInputView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_input);
        mEditInputView = findViewById(R.id.bgl_input);

        final Button button = findViewById(R.id.submit);
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                Intent replyIntent = new Intent();
                if (TextUtils.isEmpty(mEditInputView.getText())) {
                    setResult(RESULT_CANCELED, replyIntent);
                } else {
                    String input1 = mEditInputView.getText().toString();
                    replyIntent.putExtra(EXTRA_REPLY, input1);
                    setResult(RESULT_OK, replyIntent);
                }
                finish();
            }
        });

    }

输入列表适配器.java


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class InputListAdapter extends RecyclerView.Adapter<InputListAdapter.InputViewHolder> {

    class InputViewHolder extends RecyclerView.ViewHolder {
        private final TextView input1ItemView;

        private InputViewHolder(View itemView) {
            super(itemView);
            input1ItemView = itemView.findViewById(R.id.textView);
        }
    }

    private final LayoutInflater mInflater;
    private List<Input1> mInput1s; // Cached copy of words

    InputListAdapter(Context context) { mInflater = LayoutInflater.from(context); }

    @Override
    public InputViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = mInflater.inflate(R.layout.inputlist_item, parent, false);
        return new InputViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(InputViewHolder holder, int position) {
        if (mInput1s != null) {
            Input1 current = mInput1s.get(position);
            holder.input1ItemView.setText(current.getInput1());
        } else {
            // Covers the case of data not being ready yet.
            holder.input1ItemView.setText("No Input");
        }
    }

    void setInput1s(List<Input1> input1s){
        mInput1s = input1s;
        notifyDataSetChanged();
    }

    // getItemCount() is called many times, and when it is first called,
    // mInputs has not been updated (means initially, it's null, and we can't return null).
    @Override
    public int getItemCount() {
        if (mInput1s != null)
            return mInput1s.size();
        else return 0;
    }

}

Table.java(显示recyclerView的片段)


    public Table() {
        // Required empty public constructor
    }

    private RecyclerView mRecyclerView;
    private InputListAdapter mAdapter;
    private InputViewModel mInputViewModel;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        InputRoomDatabase db = Room.databaseBuilder(getActivity(),InputRoomDatabase.class, "input_database")
                .build();
        //add recycler view
        final View rootView = inflater.inflate(R.layout.fragment_table, container, false);
        RecyclerView recyclerView = rootView.findViewById(R.id.recyclerview);
        //set adapter
        final InputListAdapter adapter1 = new InputListAdapter(getContext());
        recyclerView.setAdapter(adapter1);
        //set layout manager
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        //show input list in recycler view
        mInputViewModel = ViewModelProviders.of(this).get(InputViewModel.class);
        mInputViewModel.getAllInput1s().observe(this, new Observer<List<Input1>>() {
            @Override
            public void onChanged(@Nullable final List<Input1> input1s) {
                // Update the cached copy of the words in the adapter.
                adapter1.setInput1s(input1s);
            }
        });

        // Inflate the layout for this fragment
        //return inflater.inflate(R.layout.fragment_table, container, false);
        return rootView;
    }

}

Tabbed.java(基础片段类)(这不是完整的类,只有相关代码)

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == INPUT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
            Input1 input1 = new Input1(data.getStringExtra(input.EXTRA_REPLY));
            **mInputViewModel.insert(input1);**
            } else {
                Toast.makeText(
                        getApplicationContext(),
                        R.string.empty_not_saved,
                        Toast.LENGTH_LONG).show();
                }
        }
    public static final int INPUT_ACTIVITY_REQUEST_CODE = 1;

这是 logcat 错误:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.mysugartracker/com.example.mysugartracker.Tabbed}: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.mysugartracker.InputViewModel.insert(com.example.mysugartracker.Input1)' on a null object reference

at com.example.mysugartracker.Tabbed.onActivityResult(Tabbed.java:111)

第 111 行在代码中标有 **

标签: androidnullpointerexceptionandroid-room

解决方案


感谢大家的帮助。mInputViewModel = ViewModelProviders.of(this).get(InputViewModel.class); 我通过在 Tabbed.java 中添加这一行来解决这个问题


推荐阅读