Как исправить NullPointerException: попытка вызвать виртуальный метод 'java.lang.String com.example.rsolveapp.User.getEmail ()' - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь получить данные от текущего зарегистрированного пользователя из моей базы данных реального времени 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("");
        }
    });
}

1 Ответ

0 голосов
/ 17 октября 2019

Кажется, что в данных, которые вы обрабатываете, нет действительного User объекта.

Ваш JSON использует push-идентификаторы для дочерних узлов, в то время как ваш код загружается из 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("");
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...