Java 如何预防;Firestore,提供的文档路径不能为空;错误?
我有一个android应用程序,目前有约2k个活跃用户。它使用Firebase Firestore数据库来保存用户数据和其他内容。但最近我从readUserDataFromDatabase函数中得到了此错误和崩溃报告:Java 如何预防;Firestore,提供的文档路径不能为空;错误?,java,android,firebase,firebase-authentication,google-cloud-firestore,Java,Android,Firebase,Firebase Authentication,Google Cloud Firestore,我有一个android应用程序,目前有约2k个活跃用户。它使用Firebase Firestore数据库来保存用户数据和其他内容。但最近我从readUserDataFromDatabase函数中得到了此错误和崩溃报告: private void readUserDataFromDatabase(String uid) { db.collection(Constants.PARAM_USERS) .document(uid) // (MainActivity
private void readUserDataFromDatabase(String uid) {
db.collection(Constants.PARAM_USERS)
.document(uid) // (MainActivity.java:215)This is where the crash happens
.get()
.addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
UserData userData = documentSnapshot.toObject(UserData.class);
if (userData == null)
return;
tvName.setText(getString(R.string.welcome, userData.getName()));
Picasso
.get()
.load(userData.getPhotoUrl())
.placeholder(getResources().getDrawable(R.drawable.place_holder))
.transform(new RoundedCornersTransform())
.into(ivPhoto);
UserData.getInstance().setCredit(userData.getCredit());
UserData.getInstance().setPhotoUrl(userData.getPhotoUrl());
UserData.getInstance().setName(userData.getName());
if (userData.getInstanceId() != null) {
UserData.getInstance().setInstanceId(userData.getInstanceId());
}
}
});
}
事故率约为%1,但我仍然看不出我在这里遗漏了什么。firebase用户id是否有可能返回null,或者在登录成功后,readUserDataFromDatabase是否会在之前运行
UserData.getInstance().setUserId(user.getUid())代码>
功能?我不知道。多谢各位
编辑1:添加了堆栈跟踪
致命异常:java.lang.RuntimeException:无法启动活动
ComponentInfo{com.alialacan.kpss/com.alialacan.kpss.MainActivity}:
java.lang.NullPointerException:提供的文档路径不能为空
无效的
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2781)
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)
位于android.app.ActivityThread.-wrap11(未知来源)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592)上
位于android.os.Handler.dispatchMessage(Handler.java:106)
位于android.os.Looper.loop(Looper.java:164)
位于android.app.ActivityThread.main(ActivityThread.java:6518)
位于java.lang.reflect.Method.invoke(Method.java)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
编辑2:此处为setUser函数调用的位置:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
} else {
Toast.makeText(LoginActivity.this, R.string.error_google_login,
Toast.LENGTH_SHORT).show();
hideProgress();
}
}
}
private void handleFacebookAccessToken(AccessToken token) {
Log.d("", "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d("", "signInWithCredential:success");
user = auth.getCurrentUser();
setUser(user);
} else {
setUser(null);
Log.w("", "signInWithCredential:failure", task.getException());
Toast.makeText(LoginActivity.this, R.string.error_email_already_exist,
Toast.LENGTH_SHORT).show();
hideProgress();
}
}
});
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = auth.getCurrentUser();
setUser(user);
} else {
Toast.makeText(LoginActivity.this, R.string.error_google_login,
Toast.LENGTH_SHORT).show();
setUser(null);
hideProgress();
}
}
});
}
@覆盖
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
callbackManager.onActivityResult(请求代码、结果代码、数据);
if(requestCode==Constants.RC\u SIGN\u IN){
GoogleSignInResult结果=Auth.GoogleSignInApi.getSignInResultFromIntent(数据);
if(result.issucess()){
GoogleSignInAccount account=result.getSignInAccount();
firebaseAuthWithGoogle(账户);
}否则{
Toast.makeText(LoginActivity.this,R.string.error\u google\u login,
吐司。长度(短)。show();
hideProgress();
}
}
}
私有无效handleFacebookAccessToken(AccessToken令牌){
Log.d(“,”handleFacebookAccessToken:“+token”);
AuthCredential credential=FacebookAuthProvider.getCredential(token.getToken());
使用凭证(凭证)进行身份验证登录
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Log.d(“,”带凭证的登录:成功”);
user=auth.getCurrentUser();
setUser(用户);
}否则{
setUser(空);
Log.w(“,”signInWithCredential:failure“,task.getException());
Toast.makeText(LoginActivity.this、R.string.error\u email\u已经存在,
吐司。长度(短)。show();
hideProgress();
}
}
});
}
私有void firebaseAuthWithGoogle(谷歌签名帐户){
AuthCredential credential=GoogleAuthProvider.getCredential(acct.getIdToken(),null);
使用凭证(凭证)进行身份验证登录
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=auth.getCurrentUser();
setUser(用户);
}否则{
Toast.makeText(LoginActivity.this,R.string.error\u google\u login,
吐司。长度(短)。show();
setUser(空);
hideProgress();
}
}
});
}
错误消息表示此代码正在将空值传递给readUserDataFromDatabase
readUserDataFromDatabase(UserData.getInstance().getUserId());
这意味着UserData.getInstance().getUserId()
返回null
这里确实没有足够的代码来完全诊断问题,因为您也没有显示调用了什么setUser
,但您需要将其追溯到源代码。对于我来说,清除缓存很有帮助,因为我刚刚做了更改
collection(“Posts”).orderBy(“timestamp”,Query.Direction.DESCENDING)
到collection(“Posts”).orderBy(“like_count”,Query.Direction.DESCENDING)
请编辑包含崩溃详细信息的问题。是否有堆栈跟踪?您好,使用堆栈跟踪编辑。添加的函数调用setUser,但setUser在其参数为null时返回void。谢谢你的回答。我将尝试改变缓存用户数据的方式。谢谢,这对我很有效。我只是没有将intent.putExtra传递给下一个活动,并在下一个活动中尝试使用它。
Caused by java.lang.NullPointerException: Provided document path must not be null.
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:228)
at com.google.firebase.firestore.CollectionReference.document(SourceFile:90)
at com.alialacan.kpss.MainActivity.readUserDataFromDatabase(MainActivity.java:215)
at com.alialacan.kpss.MainActivity.onCreate(MainActivity.java:114)
at android.app.Activity.performCreate(Activity.java:7013)
at android.app.Activity.performCreate(Activity.java:7004)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2734)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2859)
at android.app.ActivityThread.-wrap11(Unknown Source)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1592)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6518)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
if (requestCode == Constants.RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
GoogleSignInAccount account = result.getSignInAccount();
firebaseAuthWithGoogle(account);
} else {
Toast.makeText(LoginActivity.this, R.string.error_google_login,
Toast.LENGTH_SHORT).show();
hideProgress();
}
}
}
private void handleFacebookAccessToken(AccessToken token) {
Log.d("", "handleFacebookAccessToken:" + token);
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d("", "signInWithCredential:success");
user = auth.getCurrentUser();
setUser(user);
} else {
setUser(null);
Log.w("", "signInWithCredential:failure", task.getException());
Toast.makeText(LoginActivity.this, R.string.error_email_already_exist,
Toast.LENGTH_SHORT).show();
hideProgress();
}
}
});
}
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
auth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = auth.getCurrentUser();
setUser(user);
} else {
Toast.makeText(LoginActivity.this, R.string.error_google_login,
Toast.LENGTH_SHORT).show();
setUser(null);
hideProgress();
}
}
});
}
readUserDataFromDatabase(UserData.getInstance().getUserId());