android.content.Context.getPackageName() 在空对象引用上

android.content.Context.getPackageName() on a null object reference

提问人:Dancan Angwenyi 提问时间:4/28/2020 最后编辑:ZainDancan Angwenyi 更新时间:10/19/2022 访问量:10302

问:

从片段转换为活动时出现此错误,如下所示:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference         at android.content.ComponentName.<init>(ComponentName.java:130)         at android.content.Intent.<init>(Intent.java:6108)

下面是我进入下一个活动的代码,错误发生在下面代码的第一行。

  Intent mainIntent = new Intent (getContext(), MainActivity.class);
            mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity (mainIntent);

到目前为止,我在网上没有看到任何解决方案。

java android-fragments android-activity nullpointerexception

评论

0赞 4/28/2020
试试这个: stackoverflow.com/a/31419916/2711811 创建时 .Intent

答:

1赞 Komal 4/28/2020 #1

请尝试使用 getContext() 的 getActivity() intsead

1赞 Jose Antonio Sarria Garcia 4/28/2020 #2

我用这段代码处理片段的事务

private Context context;

context.startActivity(new Intent(context, MainActivity.class)); 
5赞 Zain 4/28/2020 #3

似乎你得到了一个错误的上下文,引发了这个问题NullPointerException

尝试替换以下行:

Intent mainIntent = new Intent (getContext(), MainActivity.class);

附:>>您是否在活动中

Intent mainIntent = new Intent (this, MainActivity.class);

with:>>是否在 Activity 的回调侦听器中

Intent mainIntent = new Intent (MyActivityName.this, MainActivity.class);     

With:>> 如果您在片段中

Intent mainIntent = new Intent (requireActivity(), MainActivity.class);
0赞 Amit Gupta 4/28/2020 #4

由于您是从 Fragment 调用的,因此您应该在此处使用 getActivity() 而不是 getContext()

Intent mainIntent = new Intent (getActivity(), MainActivity.class);
        mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity (mainIntent);

我希望这应该会有所帮助。

1赞 Dancan Angwenyi 4/28/2020 #5

我已经能够找到解决这个问题的方法。我意识到我收到错误是因为我在 firebase OnCompleteListener 中创建了新的 Intent,如下所示。因此,在我从监听器内部删除它并在外部调用它后,我的程序可以正常工作。

相反,我创建了一个全局布尔变量,在成功存储数据时将其更新为 true。然后我可以在其他地方访问它,然后转换到另一个(如果为 true)。

 #BEFORE

    PostsRef.child(key).updateChildren(postsMap)
                                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                            if (task.isSuccessful()) {
                                                Toast.makeText(getActivity(), "New Post is updated successfully.", Toast.LENGTH_SHORT).show();
                                                Intent mainIntent = new Intent (getActivity(), MainActivity.class);
                                                mainIntent.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                                startActivity (mainIntent);
                                            } else {
                                                Toast.makeText(context, "Error occured while updating your post.", Toast.LENGTH_SHORT).show();
                                            }
                                        }
                                    });
#AFTER

 PostsRef.child(key).updateChildren(postsMap)
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        mSuccess = true;
                                        Toast.makeText(getActivity(), "New Post is updated successfully.", Toast.LENGTH_SHORT).show();
                                    } else {
                                        Toast.makeText(context, "Error occured while updating your post.", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            });
1赞 Dancan Angwenyi 4/30/2020 #6

大家好,我也意识到这个错误的一个重要原因是生命周期方法。因此,我在我的片段中覆盖了它们,以更新 firebase 数据库上的用户状态。因此,每当我尝试移动到管理它的主要活动时,它们都会导致错误。如果我使用片段转换移动到另一个片段,MainActivity 将被超过两倍以上。在停止覆盖它们后,我的应用程序工作正常。如果有人能解释为什么会发生这种情况,那就太好了。android.content.Context.getPackageName() on a null object reference

   @Override
        public void onStart() {
            super.onStart();
    updateUserState("Online");
        }
@Override
        public void onResume() {
            super.onResume();
    updateUserState("Online");
        }
0赞 Samir Alakbarov 6/5/2021 #7

有时 startActivity 方法会抛出类似这样的异常:

从 Activity 上下文外部调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK标志。这真的是你想要的吗?

所以你应该方法intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)