为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2022-05-25 16:21:08
调用 (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;@Overrideprotected 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();        }    });}@Overridepublic 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));}}
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

首先,您没有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();

        }

    });

}


@Override

public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;

}

请调用该方法getUserData()或将其代码移入onCreate().


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 117 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信