首页 > 解决方案 > 如何修复 NullPointerException:尝试调用虚拟方法“java.lang.String com.example.rsolveapp.User.getEmail()”

问题描述

我正在尝试从我的firebase实时数据库中检索当前登录用户的数据,但是当我进入假设显示数据的活动时,应用程序崩溃并出现以下错误“java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String com.example.rsolveapp.User.getEmail()' 在空对象引用上"

这是显示数据的活动

public class RsolverAccount extends AppCompatActivity {


TextView showEmail;
private static final String TAG = RsolverAccount.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.rsolveraccount);

    setWidget();
    showData();
}

private void showData () {

    FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
    if(firebaseUser != null) {
        String email = firebaseUser.getEmail();
        Log.d(TAG, email);
    }

    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    DatabaseReference mDatabase;
    mDatabase = FirebaseDatabase.getInstance().getReference().child("sraboetapp").child("userdesc").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    ValueEventListener postListener = new ValueEventListener() {

        @Override
        public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            showEmail.setText(user.getEmail());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
    mDatabase.addValueEventListener(postListener);
}

public void setWidget() {
    showEmail = (TextView) findViewById(R.id.showEmail);
}
}

这是我的用户类

public class User implements Serializable{
private String email;
private String name, pass, id, phone;
private String key;

public User(){

}

public String getKey(){
    return key;
}

public void setKey(String key){
    this.key=key;
}

public String getEmail(){
    return email;
}

public void setEmail(String email){
    this.email=email;
}

public String getName(){
    return name;
}

public void setName(String name){
    this.name=name;
}

public String getPass(){
    return pass;
}

public void setPass(String pass){
    this.pass=pass;
}

public String getId(){
    return id;
}

public void setId(String id){
    this.id=id;
}

public String getPhone(){
    return phone;
}

public void setPhone(String phone){
    this.phone=phone;
}

@Override
public String toString(){
    return " "+email+"/n"+
            " "+name+"/n"+
            " "+pass+"/n"+
            " "+id+"/n"+
            " "+phone;
}

public User(String Remail, String Rname, String Rpass, String Rid, String Rphone){
    this.email=Remail;
    this.name=Rname;
    this.pass=Rpass;
    this.id=Rid;
    this.phone=Rphone;
}
}

这是我的数据库结构

{
  "description" : {
    "-LpJNvsR3oIGA5pv1uOK" : {
      "day" : "2",
      "description" : "tes",
      "eHour" : "12",
      "eMin" : "12",
      "sHour" : "12",
      "sMin" : "12"
    }
  },
  "userdesc" : {
    "-LquV8N1AJbRdhSKMA2T" : {
      "email" : "bryan5@gmail.com",
      "id" : "870788464845",
      "name" : "bry5",
      "pass" : "123456",
      "phone" : "484854484546"
    }
  }
}

这就是我插入数据的方式

private void RegisterUser() {
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                String emailUser = e1.getText().toString().trim();
                String passwordUser = e3.getText().toString().trim();
                String name1 = e2.getText().toString();
                String id = e5.getText().toString();
                String phone = e6.getText().toString();

            if (emailUser.isEmpty()){
                e1.setError("Email tidak boleh kosong");
            }
            // jika email not valid
            else if (!Patterns.EMAIL_ADDRESS.matcher(emailUser).matches()){
                e1.setError("Email tidak valid");
            }
            // jika password kosong
            else if (passwordUser.isEmpty()){
                e3.setError("Password tidak boleh kosong");
            }
            //jika password kurang dari 6 karakter
            else if (passwordUser.length() < 6){
                e3.setError("Password minimal terdiri dari 6 karakter");
            }
            else {
                //create user dengan firebase auth
                auth.createUserWithEmailAndPassword(emailUser,passwordUser)
                        .addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                //jika gagal register do something
                                if (!task.isSuccessful()){
                                    Toast.makeText(Register.this,
                                            "Register gagal karena "+ task.getException().getMessage(),
                                            Toast.LENGTH_LONG).show();
                                }
                                else {
                                    //jika sukses akan menuju ke login activity
                                    if(!isEmpty(e1.getText().toString()) && !isEmpty(e2.getText().toString()) && !isEmpty(e3.getText().toString()) && !isEmpty(e5.getText().toString())&& !isEmpty(e6.getText().toString())) {
                                        submitUser(new User(e1.getText().toString(), e2.getText().toString(), e3.getText().toString(), e5.getText().toString(), e6.getText().toString()));
                                        //Toast.makeText(this,"Wassup",Toast.LENGTH_SHORT).show();
                                        /*startActivity(new Intent(MainActivity.this,MainActivity2.class));*/
                                        //EditText etLocation = (EditText) findViewById(R.id.desc);
                                        SharedPreferences sharedPref = getSharedPreferences("myuser", MODE_PRIVATE);
                                        SharedPreferences.Editor editor = sharedPref.edit();
                                        editor.putString("user", emailUser);
                                        editor.apply();
                                        Intent intent = new Intent(Register.this, MainActivity.class);
                                        //intent.putExtra("location", etLocation.getText().toString());
                                        startActivity(intent);
                                    }

                                    else{
                                        InputMethodManager imm = (InputMethodManager)
                                                getSystemService(Context.INPUT_METHOD_SERVICE);
                                        imm.hideSoftInputFromWindow(
                                                e1.getWindowToken(), 0);
                                    }
                                }
                            }
                        });
            }
        }
    });
}

private boolean isEmpty(String s) {

    return TextUtils.isEmpty(s);
}

private void submitUser(User user) {
    database.child("userdesc").push().setValue(user).addOnSuccessListener(this, new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            e1.setText("");
            e2.setText("");
            e3.setText("");
            e4.setText("");
            e5.setText("");
            e6.setText("");
        }
    });
}

标签: androidfirebasefirebase-realtime-database

解决方案


您正在处理的数据中似乎没有有效User的对象。

您的 JSON 正在为其下的子节点使用推送 ID,而您的代码从FirebaseAuth.getInstance().getCurrentUser().getUid(). 如果你想通过他们的 UID 加载用户,你应该将它们存储在他们的 UID 下,例如:

mDatabase = FirebaseDatabase.getInstance().getReference().child("sraboetapp").child("userdesc").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
mDatabase.setValue(user);

根据您添加到问题的代码submitUser应该是:

private void submitUser(User user) {
    database.child("userdesc").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).setValue(user).addOnSuccessListener(this, new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            e1.setText("");
            e2.setText("");
            e3.setText("");
            e4.setText("");
            e5.setText("");
            e6.setText("");
        }
    });
}

推荐阅读