因为在整个项目中使用了相同的实例,所以我决定将它们放在单独的类中,并使用静态方法进行调用。问题是它们中的一些效果很好,而有些则效果不佳。不明白什么是逻辑。

我有一个带有实例的课程(我知道dagger2不用担心)

public class FirebaseReferences {

   public static FirebaseUser currentUserInstance = FirebaseAuth.getInstance().getCurrentUser();
   public static String currentUserUid = currentUserInstance.getUid();

   public static FirebaseUser getCurrentUserInstance(){
       return FirebaseAuth.getInstance().getCurrentUser();
   }

    public static DatabaseReference getCurrentUserUidReference(){
        return FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserUid);
    }

    static String getCurrentUserUidString(String uid){
        String currentUid = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserUid).toString();
        return currentUid;
    }

    public String getUserToken(){
        return FirebaseInstanceId.getInstance().getToken();
    }

}


那个我试图调用getCurrentUserInstance但很热的错误的类

firebaseAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                Log.v("RW", "onAuthStateChanged" );
                if (FirebaseReferences.getCurrentUserInstance() != null) {
                    Log.v("RW", "user is not null");
                    //Create new user
                    final String userName = FirebaseReferences.getCurrentUserInstance().getDisplayName();
                    FirebaseReferences.getCurrentUserUidReference().addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            //the image is still the default one
                            HashMap<String, String> userMap = new HashMap<>();
                            userMap.put("name", userName);
                            userMap.put("image", "default");
                            userMap.put("thumb_image", "default");
                            userMap.put("status", "Your status is here...");
                            FirebaseReferences.getCurrentUserUidReference().setValue(userMap);


                        }


错误代码

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.borisruzanov.russianwives, PID: 19900
              java.lang.ExceptionInInitializerError
                  at com.borisruzanov.russianwives.utils.FirebaseReferences.getCurrentUserInstance(FirebaseReferences.java:14)
                  at com.borisruzanov.russianwives.utils.AuthStateListenerUtil$1.onAuthStateChanged(AuthStateListenerUtil.java:34)
                  at com.google.firebase.auth.zzi.run(Unknown Source)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6119)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
               Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.firebase.auth.FirebaseUser.getUid()' on a null object reference
                  at com.borisruzanov.russianwives.utils.FirebaseReferences.<clinit>(FirebaseReferences.java:11)


我不确定,但是也许我犯了一个错误,我试图将这些实例保存在单独的班级中?或者,也许有更好的做法,我该怎么做?但是无论如何,我不想复制粘贴所有在所有类中都相似的实例

PS。
我试图编辑代码,现在可以使用了。但是奇怪的是,在这里FirebaseUser user = firebaseAuth.getCurrentUser();我在不调用静态方法的情况下将FirebaseUser与变量一起使用,当我使用静态方法时它可以正常工作。但同时在FirebaseReferences.getCurrentUserUidReference().行中它与static

     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                    FirebaseUser user = firebaseAuth.getCurrentUser();
                    Log.v("RW", "onAuthStateChanged" );
                    if (user != null) {
                        Log.v("RW", "user is not null");
                        //Create new user
                        String uid = user.getUid();
                        final String userName = FirebaseReferences.getCurrentUserInstance().getDisplayName();

                        FirebaseReferences.getCurrentUserUidReference().addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {

最佳答案

没有有效的Firebase用户通过其auth触发器登录。如果会话已过期,用户不再有效或已禁用,则会发生这种情况。

在使用任何与用户相关的数据之前,请务必先进行空检查

if(Firebase.getInstance().getCurrentUser()!=null){
  //Do your thing
}


基本上,您的静态方法getCurrentUserInstance()返回一个空用户,并且您将在此空引用上调用getUserId()。对结果进行空检查

10-08 17:15