Java Android firebase寄存器,当前用户尝试获取显示名称时出现空指针异常
我有以下问题,我有以下示例代码: 当我尝试使用这个-->“databaseRef.child(user.getDisplayName()).setValue(displayName);” 我得到下面的错误。有人能解释为什么会这样吗?对我来说似乎很正常。我不明白为什么会产生错误Java Android firebase寄存器,当前用户尝试获取显示名称时出现空指针异常,java,android,firebase,nullpointerexception,Java,Android,Firebase,Nullpointerexception,我有以下问题,我有以下示例代码: 当我尝试使用这个-->“databaseRef.child(user.getDisplayName()).setValue(displayName);” 我得到下面的错误。有人能解释为什么会这样吗?对我来说似乎很正常。我不明白为什么会产生错误 public void registerUser(final String displayName, String email, final String password){ regAuth.create
public void registerUser(final String displayName, String email, final String password){
regAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user=regAuth.getCurrentUser();
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName(displayName).build();
user.updateProfile(profileUpdates);
databaseRef.push().child(user.getDisplayName()).setValue(displayName);
FirebaseAuth.getInstance().signOut();
Spannable errormes = new SpannableString("Registration Successful As User :" + displayName);
errormes.setSpan(new ForegroundColorSpan(Color.GREEN), 0, errormes.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
error.setText(errormes);
Intent loginIntent = new Intent(RegisterActivity.this, login.class);
startActivity(loginIntent);
finish();
} else {
if(password.length()<6)
error.setText("Password too Short! Must be at least 6 characters long! \n Please provide different password.");
Toast.makeText(RegisterActivity.this, "Error with registration!", Toast.LENGTH_LONG).show();
error.setText(" Error 110! User already exists! \n Please provide different username!");
try {
throw task.getException();
} catch (FirebaseAuthWeakPasswordException e) {
Log.e("Exception", e.getMessage());
} catch (FirebaseAuthInvalidCredentialsException e) {
Log.e("Exception", e.getMessage());
} catch (FirebaseAuthUserCollisionException e) {
Log.e("Exception", e.getMessage());
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
}
});
}
public void registerUser(最终字符串显示名称、字符串电子邮件、最终字符串密码){
regAuth.createUserWithEmailAndPassword(电子邮件,密码).addOnCompleteListener(这是新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=regAuth.getCurrentUser();
UserProfileChangeRequest profileUpdates=新建UserProfileChangeRequest.Builder()
.setDisplayName(displayName).build();
user.updateProfile(profileUpdates);
databaseRef.push().child(user.getDisplayName()).setValue(displayName);
FirebaseAuth.getInstance().signOut();
Spannable erromes=新的SpannableString(“注册成功为用户:“+displayName”);
errormes.setSpan(新的ForegroundColorSpan(Color.GREEN),0,errormes.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
error.setText(errormes);
Intent loginIntent=newintent(RegisterActivity.this,login.class);
startActivity(登录);
完成();
}否则{
如果(password.length()检查数据库ref的值及其指向的位置。
确保databaseRef.child的数据库引用确实存在。
看起来像是user.getDisplayName()
正在返回NULL,因此它被映射到
databaseRef.child(NULL).setValue(displayName);
尝试打印控制台或日志中的所有值,并在浏览器上使用Firebase数据库进行交叉检查
还可以尝试使用侦听器更新
user.updateProfile(profileUpdates).
addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Log.d("Success", "Success");
}
});
user.updateProfile(profileUpdates)。
addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
日志d(“成功”、“成功”);
}
});
事实上,您正在设置名称,尝试使用方法获取值与此有关。您已经拥有该值,因此不需要使用getter
但是,您的用户引用可能不应该使用作为数据库键的显示名称。特别是如果多个用户可以使用相同的名称。您的意思可能是
databaseRef.child(user.getUid()).setValue(displayName);
或者使用一个不能为null的子键,如错误所述
另外,不确定这是否必要,因为您已经在为当前用户更新配置文件了好的,谢谢大家的尝试。@cricket_007让我想得更好。我已经有了用户名,所以只需更改这个databaseRef.child(user.getDisplayName()).setValue(displayName);
对此
databaseRef.push().child(displayName).setValue(null);
无法理解为什么在同一代码块上使用user.getDisplayName()时无法读取用户名,但它是这样工作的。getCurrentUser()
可以返回null,看起来好像是这样。您是否初始化了firebaseAuthfirebaseAuth.getInstance();
?Yea user.getDisplayName()为null,但无法理解原因…上面是user和setDisplayName的初始化。因此它应该正常工作?它正确设置了显示名称,但在相同的方法中,它似乎无法获取它。databaseRef=FirebaseDatabase.getInstance().getReference().child(“用户名:”);可能是因为您的配置文件更新脚本未按预期工作。请尝试此firebaseUser.updateProfile(userProfileChangeRequest).addOnCompleteListener(new OnCompleteListener(){@Override public void onComplete(@NonNull Task Task){Log.d(“成功”,“成功”);});检查更新的答案,因为@cricket_007建议您不需要获取用户名,因为您已经拥有了名称为displayname的方法我在另一个活动中使用了几乎相同的代码,其工作方式就像它在数据库中创建了一个具有用户名的子项一样,只是似乎我在注册时无法获取用户名。似乎我必须以某种方式登录用户获取名称,然后断开连接并提示他登录屏幕createUser方法调用分配当前用户,但他们不一定有显示名称尝试获取该用户对象IDIt有一个来自其提供的EditText的显示名称。脚本在FireBase上工作,我指的是添加了显示名称的用户,但在其内部s block它似乎不起作用了……我补充了更多的答案