Android Firebase注册调用user.getDisplayName()触发空指针异常求助
问题原因与解决方案
为什么会触发这个空指针异常?
你碰到的NullPointerException核心原因是**user.updateProfile(profileUpdates)是异步执行的操作**——调用这个方法后,它不会立刻同步更新用户对象里的displayName属性,而是在后台完成修改。你紧接着就调用user.getDisplayName(),此时更新操作还没完成,而新注册的Firebase用户默认displayName就是null,这就导致你给child()方法传了null,触发了Firebase的参数校验错误。
修复方案:等待资料更新完成后再执行后续逻辑
你需要给updateProfile()添加一个OnCompleteListener,等用户资料更新成功的回调触发后,再去执行数据库写入、登出、页面跳转这些操作。修改后的代码如下:
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()) { final FirebaseUser user=regAuth.getCurrentUser(); UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder() .setDisplayName(displayName).build(); // 等待用户资料更新完成后再执行后续逻辑 user.updateProfile(profileUpdates).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> profileTask) { if (profileTask.isSuccessful()) { // 此时displayName已经更新完成,可安全获取 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 { // 处理用户资料更新失败的情况 Toast.makeText(RegisterActivity.this, "Failed to update user profile!", Toast.LENGTH_LONG).show(); Log.e("ProfileUpdateError", profileTask.getException().getMessage()); } } }); } 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()); } } } }); }
额外提醒
- 新注册的Firebase用户,
displayName、photoUrl这类非必填字段默认都是null,必须通过异步更新操作设置后,才能获取到有效值。 - Firebase的绝大多数用户操作(包括资料更新、数据读写)都是异步的,一定要在对应的回调方法里处理后续逻辑,避免出现空指针、数据不一致这类问题。
内容的提问来源于stack exchange,提问作者John Luko
相关产品推荐
相关产品推荐

