Android studio - Java Firebase 调用的空指针
Android studio - Java Null-pointer on Firebase invocation
我在运行程序中收到的实际错误是:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
这是我的 firebase 数据库 class:
import android.location.Location;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase ;
public static DatabaseReference mReferenceCrossings;
// public static DataSnapshot dataSnapshot;
public FirebaseDatabaseHelper(FirebaseDatabase mDatabase) {
mDatabase = FirebaseDatabase.getInstance();
mReferenceCrossings = mDatabase.getReference();
}
public static ArrayList<Location> sortedQuery(String reference, String orderKey) {
ArrayList<Location> results = new ArrayList<Location>();
DatabaseReference targetRef = mReferenceCrossings.child(reference);
targetRef.orderByChild(orderKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot datasnapshot) {
for (DataSnapshot child : datasnapshot.getChildren()) {
double latitude = Double.parseDouble(child.child("Latitude").getValue().toString());
double longitude = Double.parseDouble(child.child("Longitude").getValue().toString());
Location entry = new Location("coordinates");
entry.setLatitude(latitude);
entry.setLongitude(longitude);
results.add(entry);
Log.d("coordinates", results.toString());
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("Firebase error", error.getDetails());
}
});
return results;
}
}
这是我的主class:
package com.example.locationpushing;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.LocationSource;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.RemoteMessage;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private static final String TAG = "MapsActivity";
private GoogleMap mMap;
private Geocoder geocoder;
private int ACCESS_LOCATION_REQUEST_CODE = 10001;
FusedLocationProviderClient fusedLocationProviderClient;
LocationRequest locationRequest;
Marker userLocationMarker;
Circle userLocationAccuracyCircle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
geocoder = new Geocoder(this);
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
locationRequest = LocationRequest.create();
locationRequest.setInterval(330);
locationRequest.setFastestInterval(330);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Intent intentBackgroundService = new Intent(this, FirebasePushNotification.class);
startService(intentBackgroundService);
FirebaseDatabaseHelper.sortedQuery("mReferenceCrossings","Latitude");
}
我已经尝试了不同的解决方案,但我仍然收到数据库的 nullPointerException。我怎样才能正确初始化数据库以供访问?
非常感谢您对此提供的帮助。感谢您提供的任何建议。
我发现你的代码有问题。
当调用 mReferenceCrossings 的子方法时出现你的错误。
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase ;
public static DatabaseReference mReferenceCrossings;
..................
public static ArrayList<Location> sortedQuery(String reference, String orderKey) {
ArrayList<Location> results = new ArrayList<Location>();
// Your error happend by this line. because mReferenceCrossings is null.
DatabaseReference targetRef = mReferenceCrossings.child(reference);
.....................
}
}
因为mReferenceCrossings
是null
。
mReferenceCrossings
将在您的代码的以下方法中分配。
public FirebaseDatabaseHelper(FirebaseDatabase mDatabase) {
mDatabase = FirebaseDatabase.getInstance();
mReferenceCrossings = mDatabase.getReference();
}
但是我在您的主 class 中找不到此方法调用的任何部分。
您只是调用了 sort 方法而没有创建 FirebaseDatabaseHelper
。
所以你的代码有错误。
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
................................
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
.................................................
// This method called without init firebase instance
FirebaseDatabaseHelper.sortedQuery("mReferenceCrossings","Latitude");
}
}
编辑:更新解决方案。
解决方法有几种。
这是其中之一。
所以你需要像这样更新 FirebaseDatabaseHelper。
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
public static DatabaseReference mReferenceCrossings = mDatabase.getReference();
...........
}
我在运行程序中收到的实际错误是:
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firebase.database.DatabaseReference com.google.firebase.database.DatabaseReference.child(java.lang.String)' on a null object reference
这是我的 firebase 数据库 class:
import android.location.Location;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase ;
public static DatabaseReference mReferenceCrossings;
// public static DataSnapshot dataSnapshot;
public FirebaseDatabaseHelper(FirebaseDatabase mDatabase) {
mDatabase = FirebaseDatabase.getInstance();
mReferenceCrossings = mDatabase.getReference();
}
public static ArrayList<Location> sortedQuery(String reference, String orderKey) {
ArrayList<Location> results = new ArrayList<Location>();
DatabaseReference targetRef = mReferenceCrossings.child(reference);
targetRef.orderByChild(orderKey).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot datasnapshot) {
for (DataSnapshot child : datasnapshot.getChildren()) {
double latitude = Double.parseDouble(child.child("Latitude").getValue().toString());
double longitude = Double.parseDouble(child.child("Longitude").getValue().toString());
Location entry = new Location("coordinates");
entry.setLatitude(latitude);
entry.setLongitude(longitude);
results.add(entry);
Log.d("coordinates", results.toString());
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("Firebase error", error.getDetails());
}
});
return results;
}
}
这是我的主class:
package com.example.locationpushing;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import com.google.android.gms.common.api.ResolvableApiException;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationResult;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.location.LocationSettingsRequest;
import com.google.android.gms.location.LocationSettingsResponse;
import com.google.android.gms.location.SettingsClient;
import com.google.android.gms.maps.CameraUpdate;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.LocationSource;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.Circle;
import com.google.android.gms.maps.model.CircleOptions;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.messaging.FirebaseMessaging;
import com.google.firebase.messaging.RemoteMessage;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private static final String TAG = "MapsActivity";
private GoogleMap mMap;
private Geocoder geocoder;
private int ACCESS_LOCATION_REQUEST_CODE = 10001;
FusedLocationProviderClient fusedLocationProviderClient;
LocationRequest locationRequest;
Marker userLocationMarker;
Circle userLocationAccuracyCircle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
geocoder = new Geocoder(this);
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
locationRequest = LocationRequest.create();
locationRequest.setInterval(330);
locationRequest.setFastestInterval(330);
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
Intent intentBackgroundService = new Intent(this, FirebasePushNotification.class);
startService(intentBackgroundService);
FirebaseDatabaseHelper.sortedQuery("mReferenceCrossings","Latitude");
}
我已经尝试了不同的解决方案,但我仍然收到数据库的 nullPointerException。我怎样才能正确初始化数据库以供访问?
非常感谢您对此提供的帮助。感谢您提供的任何建议。
我发现你的代码有问题。 当调用 mReferenceCrossings 的子方法时出现你的错误。
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase ;
public static DatabaseReference mReferenceCrossings;
..................
public static ArrayList<Location> sortedQuery(String reference, String orderKey) {
ArrayList<Location> results = new ArrayList<Location>();
// Your error happend by this line. because mReferenceCrossings is null.
DatabaseReference targetRef = mReferenceCrossings.child(reference);
.....................
}
}
因为mReferenceCrossings
是null
。
mReferenceCrossings
将在您的代码的以下方法中分配。
public FirebaseDatabaseHelper(FirebaseDatabase mDatabase) {
mDatabase = FirebaseDatabase.getInstance();
mReferenceCrossings = mDatabase.getReference();
}
但是我在您的主 class 中找不到此方法调用的任何部分。
您只是调用了 sort 方法而没有创建 FirebaseDatabaseHelper
。
所以你的代码有错误。
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
................................
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
.................................................
// This method called without init firebase instance
FirebaseDatabaseHelper.sortedQuery("mReferenceCrossings","Latitude");
}
}
编辑:更新解决方案。
解决方法有几种。
这是其中之一。
所以你需要像这样更新 FirebaseDatabaseHelper。
public class FirebaseDatabaseHelper {
public static FirebaseDatabase mDatabase = FirebaseDatabase.getInstance();
public static DatabaseReference mReferenceCrossings = mDatabase.getReference();
...........
}