![](/img/trans.png)
[英]ExceptionInInitializerError with Firebase and Facebook
[英]ExceptionInInitializerError in Firebase
由于在整个项目中使用相同的实例,我决定将它们放在单独的类中并使用静态方法调用它们。 问题是其中一些工作得很好,而有些则不然。 不明白这是什么逻辑。
我有一个实例类(我知道 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)
我不确定,但也许我犯了一个错误,我试图将这些实例保存在单独的类中? 或者也许有更好的实践我怎么能做到这一点? 但无论如何我不想复制粘贴所有类中相似的所有实例
附注。 我尝试编辑代码,现在可以使用了。 但奇怪的是这里FirebaseUser user = firebaseAuth.getCurrentUser();
我将 FirebaseUser 与变量一起使用而不调用静态方法,当我使用静态方法时它不起作用。 但同时在FirebaseReferences.getCurrentUserUidReference().
它适用于静态
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 用户。 如果会话已过期、用户不再有效或被禁用,就会发生这种情况。
在使用任何用户相关数据之前始终进行空检查
if(Firebase.getInstance().getCurrentUser()!=null){
//Do your thing
}
基本上,您的静态方法 getCurrentUserInstance() 正在返回一个空用户,并且您正在此空引用上调用 getUserId() 。 对结果进行空检查
当您要使用时,例如currentUserInstance
只需简单地使用它。 无需创建返回相同内容的getCurrentUserInstance()
方法。 换句话说,所有这些方法声明都可以删除并仅使用静态字段: currentUserInstance
、 currentUserUid
等。
它不起作用,因为您每次都通过调用不正确的FirebaseAuth.getInstance()
创建FirebaseAuth
类的新实例。 您只需创建一次。
FirebaseUser firebaseUser = Firebase.getInstance().getCurrentUser();
现在使用这个firebaseUser
对象来获取uid
或tokenId
或您需要的其他内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.