用于登录Android Studio的实时firebase数据库上的空指针异常[重复]

Posted

技术标签:

【中文标题】用于登录Android Studio的实时firebase数据库上的空指针异常[重复]【英文标题】:null pointer exception on a realtime firebase database for login in Android Studio [duplicate] 【发布时间】:2021-03-11 08:39:11 【问题描述】:

我在从 firebase 实时数据库中检索数据时遇到问题。它一直给我一个错误说“java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.lang.String.equals(java.lang.Object)'”

所以这个方法用于从 firebase 数据库中检索数据并使用用户名和密码登录用户。

我尝试了if(Accounts.getPassword() != null && password.getText() != null && Accounts.getPassword().equals(password.getText().toString())),但没有运气,它仍然给我错误。

private void isUser() 
    final String userEnteredUsername = username.getText().toString().trim();
    final String userEnteredPassword = password.getText().toString().trim();

    DatabaseReference reff = FirebaseDatabase.getInstance().getReference("login");

    Query checkUser = reff.orderByChild("username").equalTo(userEnteredUsername);

    checkUser.addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 



            if (dataSnapshot.exists())

                String passwordFromDB = dataSnapshot.child(userEnteredUsername).child("password").getValue(String.class);
                Accounts accounts = dataSnapshot.getValue(Accounts.class);


                if (passwordFromDB.equals(userEnteredPassword) // ****Line that code is not working****

                    String usernameFromDB = dataSnapshot.child(userEnteredUsername).child("username").getValue(String.class);
                    String accountFromDB = dataSnapshot.child(userEnteredUsername).child("account").getValue(String.class);


                    Intent intent = new Intent(getApplicationContext(), Driver.class);

                    intent.putExtra("username", usernameFromDB);
                    intent.putExtra("password", passwordFromDB);
                    intent.putExtra("account", accountFromDB);

                    startActivity(intent);
                
                else 
                    password.setError("Wrong Password");
                    password.requestFocus();
                
            
            else 
                username.setError("Wrong username");
                username.requestFocus();
            
        
        @Override
        public void onCancelled(@NonNull DatabaseError error) 

        
    );
    

【问题讨论】:

你在哪一行得到这个错误?你有调试吗? if (passwordFromDB.equals(userEnteredPassword) 和调试只说那个错误。 你能检查变量是passwordFromDB null还是userEnteredPassword,哪个是null? 我认为是我的passwordFromDB 是空的,但我不知道如何在搜索年龄后解决这个问题。 我已经测试了userEnteredPassword != null,它通过了,但是passwordFromDB != null 失败了 【参考方案1】:

您可以像这样检查您的 snapshost:

List < String > userIdList;
if (dataSnapshot.exists()) 
  for (DataSnapshot ignored: dataSnapshot.getChildren()) 
    userIdList.add(ignored.getKey());
  
  for (int i = 0; i < userIdList.size(); i++) 
    String db = dataSnapshot.child(userIdList.get(i)).getValue(String.class);
  


【讨论】:

感谢您的建议!但我知道我的用户名快照不是空的,它只是检索与用户输入的用户名匹配的密码来登录是给我带来麻烦的原因。 然后创建一个名称为 User.java 的实体。将用户名和密码放入当然是构造函数中。然后像这样更改行: User db = dataSnapshot.child(userIdList.get(i)).getValue(User.class);它会自动填写您的密码字段。

以上是关于用于登录Android Studio的实时firebase数据库上的空指针异常[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Fire-base 卡住并且无法与 android studio 连接

在android studio中使用firebase实时数据库检索当前登录用户的数据

如何在 android studio IDE 中开始为 fire os 开发应用程序

Android Studio Fabric for android(Plugin) Logout(退出已登录的账户)

用于 Firebase 实时数据库/Firebase 身份验证的 Android 唯一密钥

Android studio 实现app登录注册页面