长时间未修改的代码段,突然抛出NullPointerException

问题描述 投票:0回答:1

首先,我正在开发一个应用程序,它的主要活动是Main2Activity。该活动包含5个片段:“主页”,“设置”,“新建”,“通知”和“配置文件”。

今天,我什至没有触摸此文件的代码,就开始收到此错误:

Main2Activity:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.heirup, PID: 15134
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.heirup/com.example.heirup.Main2Activity}: java.lang.NullPointerException: Provided document path must not be null.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
        at android.app.ActivityThread.access$1100(ActivityThread.java:221)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7224)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: java.lang.NullPointerException: Provided document path must not be null.
        at com.google.firebase.firestore.util.Preconditions.checkNotNull(com.google.firebase:firebase-firestore@@21.4.3:147)
        at com.google.firebase.firestore.CollectionReference.document(com.google.firebase:firebase-firestore@@21.4.3:103)
        at com.example.heirup.Main2Activity.setNotificationBadge(Main2Activity.java:142)
        at com.example.heirup.Main2Activity.onCreate(Main2Activity.java:84)
        at android.app.Activity.performCreate(Activity.java:6876)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7224) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

这是我得到错误的方法:

private void setNotificationBadge(Context context) {

        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        rootRef.collection("users").document(userId).collection("notifications").limit(10).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot documentSnapshots) {
                for (DocumentSnapshot documentSnapshot : documentSnapshots.getDocuments()) {
                    switch (documentSnapshot.getString("type")) {
                        case "USER_HAS_APPLIED":
                            //irrelevant
                            break;
                        case "ENOUGH_APPLICANTS":
                            //irrelevant
                            break;
                        case "JOB_HAS_STARTED":
                            //irrelevant
                            break;
                        case "JOB_HAS_ENDED":
                            //irrelevant
                            break;
                        case "JOB_HAS_EXPIRED":
                            //irrelevant
                            break;
                    }
                }

                for (Notification notification : notificationsList) {
                    if (!notification.isRead())
                        newNotifications++;
                }

                if (newNotifications > 0 && !checkedNotification) {
                    int menuItemId = navView.getMenu().getItem(3).getItemId();
                    badgeDrawable = navView.getOrCreateBadge(menuItemId);
                    badgeDrawable.setVisible(true);
                    badgeDrawable.setNumber(newNotifications);
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(context, "No document found", Toast.LENGTH_SHORT).show();
            }
        });
    }

基本上,userId是错误的,但是怎么可能呢?我正在使用private String userId = FirebaseAuth.getInstance().getCurrentUser().toString();来检索它,并且它一直都在工作。

我进行了一些研究,并阅读了一些开发人员在为他们的应用实现“签出”功能后遇到的问题。具有讽刺意味的是,我今天确实在我的SettingsFragment中实现了这一点:

SettingFragment-> onCreateView()

signOut = root.findViewById(R.id.sign_out_btn);
        signOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                Intent intent = new Intent(getContext(), LoginActivity.class);
                startActivity(intent);
            }
        });

有人能给我任何线索吗?希望我已经足够清楚了..

首先,我正在开发一个应用程序,它的主要活动是Main2Activity。该活动包含5个片段:“主页”,“设置”,“新建”,“通知”和“配置文件”。今天,甚至没有触摸...

android firebase google-cloud-firestore nullpointerexception firebase-authentication
1个回答
1
投票

FirebaseAuth.getInstance().getCurrentUser().toString()不返回用户ID。它返回FirebaseUser对象的字符串形式,这完全是另外一回事。您将要改用FirebaseAuth.getInstance().getCurrentUser().getUid()

© www.soinside.com 2019 - 2024. All rights reserved.