当前位置: 首页 > 知识库问答 >
问题:

java.lang.nullPointer异常:不能传递null参数'路径字符串'在子()

郝原
2023-03-14
Structure of database

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

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

但是如果我把currentUserID改为Users。。应用程序停止崩溃,运行平稳,但不会加载导航抽屉中的用户名和个人资料图像。

主要活动。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();

    }

共有3个答案

冯浩旷
2023-03-14

如果你检查,我相信你没有任何登录的用户,这就是为什么你得到null值在电流UserID

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

下面是您的onCreate函数的外观:

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

我认为您在currentUserId中获得null,然后将null传递给firebase。可能是您没有获得用户id请确保用户已登录,然后检查您是否从firebase获得用户id。如果您正在从firebase获取用户id,请尝试此操作。

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

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

欧阳何平
2023-03-14

注销后,mFirebaseUser获取空值,因此该currentUserID值也将获取空值,以避免出现空点异常。在使用currentUserID之前,请执行空值检查,如下面的代码所示

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();
    }
 类似资料:
  • 在使用RestAssured的cucumber api测试中,我试图将路径参数作为空/空传递。 例如,当我以>>http://localhost:8093/my-rest-call//指令调用endpoint时 它给404但我希望是500。在《邮递员》中,它和预期的一样工作 但是,如果末尾的path参数为null/empty。如下所示,我得到了500个内部服务器错误。 我尝试的其他选项是have“

  • 问题内容: 我有这个REST资源: 例如,param可以包含斜杠字符:。 很明显,我在用它来调用它,但是不起作用。 我也尝试过使用,将斜杠编码为,但也不起作用,它也不会到达端点。 编辑 我正在使用Retrofit来调用端点,并且这样做: 使用,但仍然无法正常工作。 问题答案: 保留字符(例如和)必须经过URL编码。 编码为 编码为 尝试。 在RFC 3986个 定义了以下一组保留的字符可被用作分隔

  • 我正在实现一个Android应用程序来加载RSS提要。在我决定添加一个新屏幕以显示两个按钮并尝试向AsyncTask传递一个字符串值之前,它工作得非常好。其思路是这样的:屏幕将显示两个按钮供用户选择。一旦用户点击了其中一个按钮,它将调用AsyncTask以及字符串值(url)到readRSS(url),然后rss提要将由displayRSS(url)显示。readRSS(url)将相应地加载RSS

  • 问题内容: 我想将参数(即字符串)传递给Onclick函数。目前,我这样做: 例如,result.name等于字符串“ Add”。当我单击此按钮时,出现一个错误,提示未定义添加。由于此函数调用可以完美地与数字参数一起使用,因此我认为它与字符串中的符号“”有关。以前有人遇到过这个问题吗? 问题答案: 看起来您是从字符串构建DOM元素。您只需要在result.name周围添加一些引号即可: 您实际上应

  • 这可能是非常基本的东西,但我很难弄清楚我哪里出错了。 我试图从帖子正文中获取一个字符串,但“jsonString”只显示为null。我还想避免使用模型,但这可能是不可能的。我与PostMan接触到的一段代码是: 也许这是我在postman上做得不正确的地方,但我一直在尝试在body-x-www-form-urlencoded部分的值部分使用“=test”(如在有关此主题的其他问题中看到的),键为j

  • 我目前正在尝试将我的Firebase数据库中的内容读入中,但我希望将它们从最后一个节点加载到第一个节点。所以我决定将键放入一个数组中,然后尝试从数组的末尾读到前面,但是当我尝试访问键数组时,我看到的是中的参数'path string'传递null错误。