在空对象引用上调用java.util.ArrayList.size()方法

4
我希望能从我的Firebase数据库中提取数据,我的表格名称是“cardornek”,并且我已经设置了读/写权限。 但是我遇到了"java.util.ArrayList.size()' on a null object reference"这个错误。你有什么想法吗? RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

private ArrayList<String> values=null;
RecyclerViewAdapter(ArrayList<String> values) {
    this.values = values;
}
@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item,parent,false));
}


@Override
public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, int position)
{
    holder.name.setText(values.get(position));
}

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

public class ViewHolder extends RecyclerView.ViewHolder
{
    private TextView name;
    ViewHolder(View itemView) {
        super(itemView);
        name = (TextView) itemView.findViewById(R.id.list_item_text);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    new GetDataFromFirebase().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

    // Read from the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("cardornek");

    myRef.addValueEventListener(new ValueEventListener() {


        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList<String> values = (ArrayList<String>) dataSnapshot.getValue();
            recyclerView.setAdapter(new RecyclerViewAdapter(values));
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("Failed to read value." + databaseError.toException());
        }
    });

dataSnapshot.getValue() returns null so you pass null into the constructur of your RecyclerViewAdapter and when android calls getItemCount() you get a NullPointerException - larsgrefer
那么,我应该做什么? - Yunus Haznedar
请查看以下示例:https://github.com/firebase/quickstart-android/tree/master/database/app/src/main/java/com/google/firebase/quickstart/database - wake-0
我正在查看这个示例 https://github.com/jefrisingh/Recyclerview-with-Firebase-Realtime-Database,因为我不使用认证过程。 - Yunus Haznedar
1个回答

12

你的问题在于(ArrayList<String>) dataSnapshot.getValue()有时为 null,并且在存储值后,在getItemCount中抛出异常。如果你可以接受在null时返回0作为大小,则解决方案为:

@Override
public int getItemCount() {
    return (values == null) ? 0 : values.size();
}

然而,你可能希望弄清楚为什么dataSnapshot.getValue会返回null。也许那才是真正的问题,而NullPointerException只是症状。


是的!谢谢,现在它可以工作了。但是卡片视图上没有显示任何数据。我想我应该检查一下我的数据库。谢谢,伙计! - Yunus Haznedar
这会做什么? - Matt
1
@Matt 如果值为null则返回0。否则,返回值的大小。这是一个巧妙的方法来避免空指针异常。 - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接