【问题标题】:java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()java.lang.NullPointerException:不能在 child() 中为参数“pathString”传递 null
【发布时间】:2018-07-27 05:09:43
【问题描述】:
Structure of database

首先,在用户登录或完全注册时进行测试时,没有异常或错误,但当用户退出并重新打开应用程序时,应用程序崩溃了。 logcat 基本上是在指出错误:

 UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener()

但如果我将 currentUserID 更改为 Users .. 应用程序会停止崩溃并平稳运行,但不会加载位于导航抽屉。

ma​​inactivity.java

public class MainActivity extends AppCompatActivity {
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;
    private RecyclerView postlist;
    private Toolbar mToolbar;
    private ActionBarDrawerToggle actionBarDrawerToggle;
    private FirebaseAuth mAuth;
    private FirebaseUser FirebaseUser;
    private DatabaseReference  UsersRef;
    private CircleImageView NavProfileImage;
    private ImageButton AddNewPostButton;
    private TextView NavProfileUserName;
    String currentUserID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAuth = FirebaseAuth.getInstance();
        final FirebaseUser mFirebaseUser = mAuth.getCurrentUser();
        if (mFirebaseUser != null) {
            currentUserID = mFirebaseUser.getUid();
        }




        mToolbar =(Toolbar) findViewById(R.id.main_page_toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setTitle("Home");

        drawerLayout = (DrawerLayout) findViewById(R.id.drawable_layout);
       actionBarDrawerToggle =  new ActionBarDrawerToggle(MainActivity.this,drawerLayout,R.string.drawer_open, R.string.drawer_close);
        navigationView = (NavigationView)findViewById(R.id.navigation_view);
       AddNewPostButton = (ImageButton)findViewById(R.id.add_new_post_button);

        drawerLayout.addDrawerListener(actionBarDrawerToggle);
       actionBarDrawerToggle.syncState();
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);


        View navView = navigationView.inflateHeaderView(R.layout.nav_header);
        NavProfileImage = (CircleImageView)navView.findViewById(R.id.nav_profile_image);
        NavProfileUserName = (TextView) navView.findViewById(R.id.nav_user_full_name);

        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
        UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {
                if(dataSnapshot.exists())
                {   if (dataSnapshot.hasChild("fullname")){
                    String fullname = dataSnapshot.child("fullname").getValue().toString();
                    NavProfileUserName.setText(fullname);
                }if (dataSnapshot.hasChild("profileimage")) {
                    String image = dataSnapshot.child("profileimage").getValue().toString();
                    Picasso.with(MainActivity.this).load(image).placeholder(R.drawable.profile).into(NavProfileImage);

                }else {
                    Toast.makeText(MainActivity.this, "Profile name do not exists...", Toast.LENGTH_SHORT).show();
                }




                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item)
            { UserMenuSelector(item);

                return false;
            }
        });
        AddNewPostButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SendUserToPostActivity();

            }
        });
    }

    private void SendUserToPostActivity() {
        Intent addNewPostIntent = new Intent (MainActivity.this,PostActivity.class);
        startActivity(addNewPostIntent);
    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser == null)
        {
            sendUserToLoginActivity();
        }else{
            CheckUserExistance();
        }
    }

    private void CheckUserExistance()
    {
        final String current_user_id = mAuth.getCurrentUser().getUid();
          UsersRef.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
                  if (!dataSnapshot.hasChild(current_user_id)){
                      sendUserToSetupActivity();
                  }
              }

              @Override
              public void onCancelled(DatabaseError databaseError) {

              }
          });
    }

    private void sendUserToSetupActivity() {
        Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class);
        setupIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(setupIntent);
        finish();

    }

    private void sendUserToLoginActivity()
    {
        Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
         loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         startActivity(loginIntent);
         finish();

    }

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    在注销mFirebaseUser 后获取 null 值,因此此 currentUserID 值也为 null 以避免 nullpointerexception 在使用 currentUserID 之前执行 null 检查,如下代码所示

    public class MainActivity extends AppCompatActivity {
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;
    private RecyclerView postlist;
    private Toolbar mToolbar;
    private ActionBarDrawerToggle actionBarDrawerToggle;
    private FirebaseAuth mAuth;
    private FirebaseUser FirebaseUser;
    private DatabaseReference  UsersRef;
    private CircleImageView NavProfileImage;
    private ImageButton AddNewPostButton;
    private TextView NavProfileUserName;
    String currentUserID;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAuth = FirebaseAuth.getInstance();
        final FirebaseUser mFirebaseUser = mAuth.getCurrentUser();
        if (mFirebaseUser != null) {
            currentUserID = mFirebaseUser.getUid();
        }
    
    
    
    
        mToolbar =(Toolbar) findViewById(R.id.main_page_toolbar);
        setSupportActionBar(mToolbar);
        getSupportActionBar().setTitle("Home");
    
        drawerLayout = (DrawerLayout) findViewById(R.id.drawable_layout);
       actionBarDrawerToggle =  new ActionBarDrawerToggle(MainActivity.this,drawerLayout,R.string.drawer_open, R.string.drawer_close);
        navigationView = (NavigationView)findViewById(R.id.navigation_view);
       AddNewPostButton = (ImageButton)findViewById(R.id.add_new_post_button);
    
        drawerLayout.addDrawerListener(actionBarDrawerToggle);
       actionBarDrawerToggle.syncState();
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
    
        View navView = navigationView.inflateHeaderView(R.layout.nav_header);
        NavProfileImage = (CircleImageView)navView.findViewById(R.id.nav_profile_image);
        NavProfileUserName = (TextView) navView.findViewById(R.id.nav_user_full_name);
    
        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
          // replace below code
         if (mFirebaseUser != null) {
    
        UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot)
            {
                if(dataSnapshot.exists())
                {   if (dataSnapshot.hasChild("fullname")){
                    String fullname = dataSnapshot.child("fullname").getValue().toString();
                    NavProfileUserName.setText(fullname);
                }if (dataSnapshot.hasChild("profileimage")) {
                    String image = dataSnapshot.child("profileimage").getValue().toString();
                    Picasso.with(MainActivity.this).load(image).placeholder(R.drawable.profile).into(NavProfileImage);
    
                }else {
                    Toast.makeText(MainActivity.this, "Profile name do not exists...", Toast.LENGTH_SHORT).show();
                }
    
    
    
    
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    
        }else{
         sendUserToLoginActivity();
        }
    
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item)
            { UserMenuSelector(item);
    
                return false;
            }
        });
        AddNewPostButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SendUserToPostActivity();
    
            }
        });
    }
    
    private void SendUserToPostActivity() {
        Intent addNewPostIntent = new Intent (MainActivity.this,PostActivity.class);
        startActivity(addNewPostIntent);
    }
    
    @Override
    protected void onStart() {
        super.onStart();
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser == null)
        {
            sendUserToLoginActivity();
        }else{
            CheckUserExistance();
        }
    }
    
    private void CheckUserExistance()
    {
        final String current_user_id = mAuth.getCurrentUser().getUid();
          UsersRef.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
                  if (!dataSnapshot.hasChild(current_user_id)){
                      sendUserToSetupActivity();
                  }
              }
    
              @Override
              public void onCancelled(DatabaseError databaseError) {
    
              }
          });
    }
    
    private void sendUserToSetupActivity() {
        Intent setupIntent = new Intent(MainActivity.this, SetupActivity.class);
        setupIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(setupIntent);
        finish();
    
    }
    
    private void sendUserToLoginActivity()
    {
        Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
         loginIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
         startActivity(loginIntent);
         finish();
    
    }
    

    或者你也可以直接在这里查看

     if (mFirebaseUser != null) {
            currentUserID = mFirebaseUser.getUid();
        }else{
            sendUserToLoginActivity();
        }
    

    【讨论】:

    • 在以下位置显示空指针异常:FirebaseUser currentUser = mAuth.getCurrentUser();
    • 很高兴帮助你交配!
    【解决方案2】:

    我认为您在currentUserId 中获得null,然后将null 传递给firebase。可能是您没有获得user id,请确保用户已登录,然后检查您是否从firebase 获得user id。如果您从 firebase 获得user id,那么试试这个。

    UsersRef.child("Users").child(currentUserID).addValueEventListener(new 
           ValueEventListener(){ }
    

    并确保您的用户模型类中的所有密钥都是公开的,我定期在 firebase 上工作了大约一个月,我遇到了很多这样的问题。

    【讨论】:

    • 完全正确.. 我上次也做了同样的事情,将其更改为 users 。它解决了空指针异常,但它没有在导航抽屉中加载用户的用户名和个人资料图像
    • 正是因为您当前的用户 ID 尚未写入用户内部,这意味着用户当前用户 ID 不是用户的孩子,这就是您收到空异常的原因,因为您引用的用户 ID 不存在然而或者它是 null ,但另一方面,如果你引用 Users ,你将不会收到 null 异常,因为 Users 键将始终存在于数据库树中
    【解决方案3】:

    如果您检查我相信您没有任何登录用户,这就是您在currentUserID 中获得null 值的原因。

    您正在检查用户是否在OnStart() 中登录,您还必须在 onCreate() 中检查。因为在活动生命周期中onCreate()onStart() 之前被调用。

    这是您的 onCreate 函数的外观:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser == null)
        {
            sendUserToLoginActivity();
        }else{
            CheckUserExistance();
        }
        //Your code ...
    }
    

    【讨论】:

      【解决方案4】:

      您收到java.lang.NullPointerException: Can't pass null for argument 'pathString' in child() 是因为当您注销用户时,您并没有将他发送到登录活动,这就是此错误的原因。解决这个问题的最简单方法是使用监听器。假设您有两个活动,LoginActivityMainActivity。可以在LoginActivity 中创建的监听器应该是这样的:

      FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
          @Override
          public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
              FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
              if (firebaseUser != null) {
                  Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                  startActivity(intent);
                  finish();
              }
          }
      };
      

      这基本上意味着如果用户已登录,则跳过LoginActivity 并转到MainActivity

      实例化FirebaseAuth 对象:

      FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
      

      然后开始监听 onStart() 方法的变化,如下所示:

      @Override
      protected void onStart() {
          super.onStart();
          firebaseAuth.addAuthStateListener(authStateListener);
      }
      

      MainActivity,你应该做同样的事情:

      FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
          @Override
          public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
              FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
              if (firebaseUser == null) {
                  Intent intent = new Intent(MainActivity.this, LoginActivity.class);
                  startActivity(intent);
              }
          }
      };
      

      这基本上意味着如果用户未登录,请跳过MainActivity 并转到LoginActivity。在这个活动中你应该做和LoginActivity一样的事情,你应该开始监听onStart()的变化。

      这样,你就再也不会遇到这样的错误了。

      【讨论】:

      • 你也试过我上面的解决方案,行得通吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2017-01-25
      • 2020-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多