java.util.Objects.requireNonNull处的java.lang.NullPointerException

java.util.Objects.requireNonNull处的java.lang.NullPointerException,java,android,android-fragments,Java,Android,Android Fragments,在我的代码中,我从一个活动调用一个函数addFood,如下所示 postFood f = new postFood(); f.addFood(context, breakfastDate, breakfastSearch, 1); 然后代码运行以下代码 public class postFood extends DialogFragment { @SuppressLint("StaticFieldLeak") private static Context context1;

在我的代码中,我从一个活动调用一个函数
addFood
,如下所示

postFood f = new postFood();
f.addFood(context, breakfastDate, breakfastSearch, 1);
然后代码运行以下代码

public class postFood extends DialogFragment {
    @SuppressLint("StaticFieldLeak")
    private static Context context1;
    @SuppressLint("StaticFieldLeak")
    private static ListView dateList1, selectedList1;
    private static ProgressDialog progressDialog;
    private static int mealType1;
    private static String TAG = "AddSelectedFood";
    private static String date;
    private static String time;
    public static String[] dateTimeString;
    public static Calendar cal;


    public  void addFood(Context context, ListView dateList, ListView selectedList,
                           int mealType) {
        dateList1 = dateList;
        selectedList1 = selectedList;
        context1 = context;
        mealType1 = mealType;
        //*FragmentManager manager = Objects.requireNonNull(this.getActivity()).getSupportFragmentManager();

        // Use the current date as the default date in the picker
        new datePickerFragment().show(Objects.requireNonNull(getActivity()).getSupportFragmentManager(), "datePicker");
    }
}
如何防止getActivity().GetSupportFragmentManaget为null

这是我的日志

2019-01-15 12:08:37.898 7908-7908/com.example.khali.nutriplan E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.khali.nutriplan, PID: 7908
java.lang.NullPointerException
    at java.util.Objects.requireNonNull(Objects.java:203)
    at com.example.khali.nutriplan.postFood.addFood(postFood.java:63)
    at com.example.khali.nutriplan.breakfastPage$1.onClick(breakfastPage.java:114)
    at android.view.View.performClick(View.java:6597)
    at android.view.View.performClickInternal(View.java:6574)
    at android.view.View.access$3100(View.java:778)
    at android.view.View$PerformClick.run(View.java:25885)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

因为我们不知道您在哪里调用方法,所以有点难说为什么
getActivity()
为null

您必须知道
getActivity()
onAttach()
之前和
ondestory()
之后是空的,如果您在这两个方法之间调用您的方法,您应该是好的

如何防止getActivity().GetSupportFragmentManaget为空?

粗暴地回答你的问题。当您在代码中使用
getActivity()
时,最好强制转换它以确保它不为null(除非您确定它不为null)。在您的代码中,应该是这样的

    // Use the current date as the default date in the picker
    if (getActivity != null){
        new datePickerFragment().show(Objects.requireNonNull(
            getActivity()).getSupportFragmentManager(), "datePicker");
    }
通过使用这些函数,您将不会出现
getActivity.getSupportFragmentManager()
为空的问题BUTT,这是因为这部分代码将不再运行。它将看到
getActivity()
为空,并且它不会跟随代码

从现在起,你的应用程序将不再崩溃,但是,你将看不到对话框。现在需要防止
getActivity()
为空。为此,我建议你去

  • 检查调用方法的位置
  • 尝试从不同的地方调用您的方法
  • 使用
    getActivity()
    时,确保活动/片段位于
    onAttach()
    onDestroy()
    方法中

  • 好的,让我很快解释一下。维巴夫·库马尔在评论中提到的是正确的,但我认为你还没有完全理解。其思想是将上下文从调用活动传递到片段。为什么?将片段视为可以在活动内部动态使用的小UI元素。这里我们来讨论第一件重要的事情:确保包含片段的活动不仅仅是一个活动,而是一个活动。 现在,您可以做两件事:

  • :返回FragmentManager,以便与与此片段的活动关联的片段进行交互。请注意,从片段放入FragmentTransaction到提交并附加到其活动,在getActivity()之前的一段时间内,该值将不为null这不是您的选项,因为显然,您的片段尚未被任何活动使用。
  • 使用传递给片段的上下文。它包含有关当前活动的信息。请记住,您的片段仍然没有附加到它。所以您要做的是:
    context.getActivity()。

  • 这会解决你的问题。始终牢记差异以及它们如何影响其行为。例如,您的片段甚至还没有附加。

    您正在实例化片段,但没有将其添加到UI中。由于调用addFood方法时片段未附加到活动,因此getActivity()返回null

    postFood f = new postFood();
    f.addFood(context, breakfastDate, breakfastSearch, 1);
    
    实例化之后,应该调用show方法将片段实例添加到UI中

    postFood f = postFood.newInstance(context, breakfastDate, breakfastSearch, 1);
    f.show(getSupportFragmentManager(), "MyTAG");
    
    并从片段中调用onViewCreated方法中的addFood方法

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
        addFood(); }
    

    你本可以教育我,而不是对这个问题投反对票。。。。。。你能帮忙吗?我不懂Java,因为这个问题没有用Java标记,那些懂Java的人不太可能看到你的问题。(换句话说,准确的标记符合您自己的最大利益:))谢谢您在传递上下文时提供了可能的副本。如果该上下文正在调用活动,您可以使用上下文替换getActivity()中的getActivity(),以便getActivity()工作,您必须首先加载片段,然后在片段附加到acivity后调用方法。context.getActivity().getSupportManager()不工作getSupportManager处于红色
    getSupportManager()
    不是我编写的内容。