如何修复空指针异常:尝试调用虚拟方法'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("");
}
});
}

您正在处理的数据中似乎没有有效的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("");
}
});
}

相关内容

最新更新