由于空对象引用,应用程序崩溃

调用 (user.getlat) 和 (user.getlng) 时出现问题。我已经全局声明了用户对象,并在 getUserData() 方法中对其进行了初始化。


但是当我运行应用程序时,应用程序崩溃并且在 logcat 中说:


java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“double com.example.profile.User.getLat()”


public class Profile extends FragmentActivity implements OnMapReadyCallback {


private GoogleMap mMap;

private LocationManager locationManager;

private LocationListener locationListener;


private FirebaseAuth mAuth;

DatabaseReference database = FirebaseDatabase.getInstance().getReference();

DatabaseReference myRef = database.child("users");

User user;



@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_profile);


    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()

            .findFragmentById(R.id.mapFragment);

    mapFragment.getMapAsync(this);


    mAuth = FirebaseAuth.getInstance();

}


public void getUserData(){

    String uID = mAuth.getCurrentUser().getUid();

    myRef.child(uID).addValueEventListener(new ValueEventListener() {

        @Override

        public void onDataChange(DataSnapshot dataSnapshot) {


            dataSnapshot.getChildren();

            user = dataSnapshot.getValue(User.class);


            Toast.makeText(Profile.this, "" + user.lng, Toast.LENGTH_LONG).show(); // Prints the value normally!


        }


        @Override

        public void onCancelled(DatabaseError databaseError) {

            Toast.makeText(Profile.this, "Failed to read from database!", Toast.LENGTH_LONG).show();

        }

    });

}


@Override

public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;


    LatLng userL = new LatLng(user.getLat(),user.getLng()); // The problem occurs here! 

    mMap.clear();

    mMap.addMarker(new MarkerOptions().position(userL).title("Your Location"));

    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userL,17));


}

}


繁华开满天机
浏览 118回答 1
1回答

神不在的星期二

首先,您没有getUserData()在任何地方调用方法。我读到您也尝试添加该逻辑onCreate(),但是没有用。添加侦听器并不意味着您会立即获得预期的结果。仅使用该onMapReady()方法设置地图,设置不依赖于User. 仅在检测到User数据更改时添加/修改地图标记。查看更改:public void getUserData(){    String uID = mAuth.getCurrentUser().getUid();    myRef.child(uID).addValueEventListener(new ValueEventListener() {        @Override        public void onDataChange(DataSnapshot dataSnapshot) {            dataSnapshot.getChildren();            user = dataSnapshot.getValue(User.class);            LatLng userL = new LatLng(user.getLat(),user.getLng());            if(mMap!=null){               mMap.clear();               mMap.addMarker(new MarkerOptions().position(userL).title("Your                Location"));             mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userL,17));            }            Toast.makeText(Profile.this, "" + user.lng, Toast.LENGTH_LONG).show(); // Prints the value normally!        }        @Override        public void onCancelled(DatabaseError databaseError) {            Toast.makeText(Profile.this, "Failed to read from database!", Toast.LENGTH_LONG).show();        }    });}@Overridepublic void onMapReady(GoogleMap googleMap) {    mMap = googleMap;}请调用该方法getUserData()或将其代码移入onCreate().
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java