获取'尝试在空对象引用上调用虚方法'java.lang.String java.lang.String.trim()'即使引用不为null

时间:2017-01-29 12:55:04

标签: android firebase android-recyclerview firebase-realtime-database firebaseui

我在我的应用中使用FirebaseUIFirebaseRecyclerAdapter更具体。

我正在使用给定here的方法从我的FirebaseDatabase引用中获取数据。

这是我的代码:

private void attachRecyclerViewAdapter() {
        Query lastFifty = mDatabase.child(rID).limitToFirst(50);
        mRecyclerViewAdapter = new FirebaseRecyclerAdapter<AModelClass, AModelClass.ViewHolder>(
                AModelClass.class, R.layout.a_player_layout, APlayersModelClass.ViewHolder.class, lastFifty) {

            @Override
            protected void populateViewHolder(AModelClass.ViewHolder viewHolder, AsModelClass model, int position) {

                String key = this.getRef(position).getKey();
                aReference.child(requestID).child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.getValue() != null) {

                            Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
                            pA = map.get("pName");
                            uA = map.get("pUrl"); 
                            // error on line below
                            String cLatS = map.get("cLat").trim();
                            currentLtAU = Double.parseDouble(cLatS);
                            String cLngS = map.get("cLng").trim();
                            currentLnAU = Double.parseDouble(cLngS);

                            viewHolder.setPName(pA);
                            viewHolder.setPUrl(uA);
                            viewHolder.setCurrentLatAU(String.valueOf(currentLtAU));
                            viewHolder.setCurrentLngAU(String.valueOf(currentLnAU));

                        } else {
                            Snackbar snackbar = Snackbar
                                    .make(coordinatorLayout, "Some error occurred. Please retry!", Snackbar.LENGTH_SHORT);
                            snackbar.show();
                            onBackPressed();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }
        };

        aList.setAdapter(mRecyclerViewAdapter);
    }

以下是数据库结构的样子:

-app
  -requestID
    -uniqueKey1
      -key: value
      -key: value
      -cLat: value
    -uniqueKey2
      -key: value
      -key: value
      -cLat: value

正如您在上面的数据库结构中所看到的,引用有2 keys,所有数据都被提取并显示在RecyclerView中,但只要从引用中删除了一个键,应用程序崩溃,在上面指定的行上发出此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference

引用仍有一个key,我正在获取的所有相同字段也在这一个键中。然后为什么我收到此错误?

1 个答案:

答案 0 :(得分:0)

如果这导致错误:

Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
String cLatS = map.get("cLat").trim();

原因很可能是快照没有子cLat

您应该查看.hasChild("cLat") - 请参阅DataSnapshot

...或阻止尝试的.trim(null)

if(map.get("cLat") != null) {
    String cLatS = map.get("cLat").trim();
    currentLtAU = Double.parseDouble(cLatS);
}

对于此类应用,您可能需要查看Firebase GeoFire