Java Android firebase寄存器,当前用户尝试获取显示名称时出现空指针异常

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

我有以下问题,我有以下示例代码: 当我尝试使用这个-->“databaseRef.child(user.getDisplayName()).setValue(displayName);” 我得到下面的错误。有人能解释为什么会这样吗?对我来说似乎很正常。我不明白为什么会产生错误

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,看起来好像是这样。您是否初始化了firebaseAuth
firebaseAuth.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它似乎不起作用了……我补充了更多的答案