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元素。这里我们来讨论第一件重要的事情:确保包含片段的活动不仅仅是一个活动,而是一个活动。 现在,您可以做两件事:
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()
不是我编写的内容。