空对象引用

时间:2016-05-19 21:54:25

标签: android json firebase jackson firebase-realtime-database

这是我希望它看起来但我得到空对象引用 在(DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {

这两个属性崩溃了所有内容

 "timeStamp" : "2016/04/27 18:28:52",
 "travelType" : "work"

JSON FROMAT

"waypoints" : {
        "-KHB1VjqUdO90vxj9XCh" : {

          "timeStamp" : "2016/04/27 18:28:52",
          "travelType" : "work"

          "-KHB1VjqUdO90vxj9XCi" : {
            "latitude" : 58.337679,
            "longitude" : 11.912757
          },
          "-KHB1ZykbwgXM9sPNie9" : {
            "latitude" : 58.281384,
            "longitude" : 12.294495
          },

        },
        "-KHpPe06hLpPttuGZ0rZ" : {

          "timeStamp" : "2016/04/27 18:28:52",
          "travelType" : "private"

          "-KHpPe07pE5ZYn4JGiZ1" : {
            "latitude" : 58.281384,
            "longitude" : 12.294495
          },
          "randomid1212" : {
            "latitude" : 57.689903,
            "longitude" : 11.989792
          },
          "randomid1213" : {
            "latitude" : 57.689905,
            "longitude" : 11.989795
          },

        }

当前的onDataChange()方法

mUserRef.addValueEventListener(new ValueEventListener() {
            //this keeps per-user list of points
            List<MyWaypoint> userWayPointsList = new ArrayList<MyWaypoint>();

            @Override
            public void onDataChange(DataSnapshot wayPointsDataSnapshot) {
                if (wayPointsDataSnapshot.getChildrenCount() > 0) {


                    for (DataSnapshot wayPointsSnapshotChild : wayPointsDataSnapshot.getChildren()) {
                        Log.i("FireBaseTester", "For-Loop :: wayPointsSnapshotChild.getValue() : " + wayPointsSnapshotChild.getValue());
                        if (wayPointsSnapshotChild.getChildrenCount() > 0) {


                            // Temporary list
                            List<String> latLngListTemp = new ArrayList<>();


                            // THIS Gives me the error because it get used in the next for loop for some reason.
                            wayPointsSnapshotChild.child("timeStamp").getValue();


                            for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {

                                //this is where we get the Lat and Lon
                                double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());
                                double longitude = Double.parseDouble(wayPointsChild.child("longitude").getValue().toString());
                                Log.i("FireBaseTester", "latitude = " + latitude + " , longitude = " + longitude);

                                latLngListTemp.add(latitude + ", " + longitude);

                            }

                            // List containing a nested List<List<String>>
                            latitudeNlongitude.add(latLngListTemp);
                        }

                    }

                }

                //here you can assign the points to the user
                Log.i("FireBaseTester", "There are " + userWayPointsList.size() + " Points for User");
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                Log.e("FireBaseTester", "onCancelled - wayPointRef Error is " + firebaseError.getMessage());
            }
        });
    } else {
        Log.i("FireBaseTester", "No WayPoints Data Received");
    }

logcat的

  

致命的例外:主要                                                                                      处理:com.example.rasmusjosefsson.rjcar,PID:25446                                                                                      java.lang.NullPointerException:尝试调用虚方法   &#39; java.lang.String java.lang.Object.toString()&#39;在null对象上   参考                                                                                          在   com.example.rasmusjosefsson.rjcar.demo.MapListActivityRealBack2 $ 1.onDataChange(MapListActivityRealBack2.java:122)                                                                                          在   com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:56)                                                                                          在com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)                                                                                          在   com.firebase.client.core.view.EventRaiser $ 1.run(EventRaiser.java:38)                                                                                          在android.os.Handler.handleCallback(Handler.java:739)                                                                                          在android.os.Handler.dispatchMessage(Handler.java:95)                                                                                          在android.os.Looper.loop(Looper.java:148)                                                                                          在android.app.ActivityThread.main(ActivityThread.java:5417)                                                                                          at java.lang.reflect.Method.invoke(Native Method)                                                                                          在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)                                                                                          在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

1 个答案:

答案 0 :(得分:1)

这些行证明了这个问题:

wayPointsSnapshotChild.child("timeStamp").getValue();
for (DataSnapshot wayPointsChild : wayPointsSnapshotChild.getChildren()) {
{ 
  double latitude = Double.parseDouble(wayPointsChild.child("latitude").getValue().toString());

wayPointSnapshotChild上调用getChildren会将timestamp值作为其中一个子级返回,该子级没有名为latitude的子级。

您可以像这样构建数据:

"waypoints" : {
    "-KHB1VjqUdO90vxj9XCh" : {

      "timeStamp" : "2016/04/27 18:28:52",
      "travelType" : "work"
      "points": {
          "-KHB1VjqUdO90vxj9XCi" : {
            "latitude" : 58.337679,
            "longitude" : 11.912757
          },
          "-KHB1ZykbwgXM9sPNie9" : {
            "latitude" : 58.281384,
            "longitude" : 12.294495
          }
      }
    }

然后在你的for循环中调用它:

wayPointsSnapshotChild.child("points").getChildren()

然后内部循环只接收包含纬度和经度属性的wayPointChild对象。