Исключение NullPointerException, связанное с FragmentManager.popBackStack. Как решить?

У меня есть приложение для Android, где у меня есть активность и стек фрагментов.

Используя Crashlytics, я получил один экземпляр следующего Exception :

 Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.FragmentManager.popBackStack(java.lang.String, int)' on a null object reference at com.company.app.Fragment$7$2.onClick(Fragment.java:397) at android.view.View.performClick(View.java:5197) at android.view.View$PerformClick.run(View.java:20926) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:5942) at java.lang.reflect.Method.invoke(Method.java) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Код, создающий эту ошибку:

 okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dialog.dismiss(); // The next line produces the Exception getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); new Handler().postDelayed(new Runnable() { @Override public void run() { // Other code... }, 250); } }); 

Основываясь на тестировании, которое я сделал с этим приложением, пользователь, для которого произошло это исключение, и тот факт, что это произошло только однажды, я думаю, что это Exception происходит, когда происходит какая-то странная консолидация обстоятельств. (В принципе, я не могу воспроизвести это Exception на моем конце.) Я предполагаю, что это связано с тем, что пользователь getFragmentManager() моему приложению, а затем возобновляет его позже, а затем getFragmentManager() возвращает null .

Итак, я знаю, что могу «исправить» это с помощью кода, подобного следующему (найденный как исправление в репозитории GitHub):

 FragmentManager fm = getFragmentManager(); if (fm != null) fm.popBackStack(); 

Хотя я понимаю, что приведенный выше код «исправит» проблему тем, что он избежит NPE (таким образом, остановив приложение от сбоя), на самом деле это не «исправляет» проблему, позволяя моему приложению функционировать по своему желанию. Fragment идет речь, занимает # 3 в стеке фрагментов, например:

 #1 --> #2 --> #3 

Желательным поведением приложения является отклик на эту кнопку, щелкнув назад, чтобы Fragment №1 был видимым. Простое добавление кода выше похоже на то, что приложение не сможет сбой, но не изменит пользовательский интерфейс приложения по желанию.

Что я делаю неправильно, так что, когда мое приложение возобновляется, это «состояние фрагмента» не в порядке?

Solutions Collecting From Web of "Исключение NullPointerException, связанное с FragmentManager.popBackStack. Как решить?"

Я никогда не сталкивался с проблемой, когда getFragmentManager () был нулевым, поэтому я предполагаю, что это часть popBack инструкции, которая вызывает проблему. Вот одно из возможных решений для предотвращения сбоя и обработки исключений. Если это произойдет только один раз, это может быть редкий случай.

 okButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getSupportFragmentManager() != null) { // Assuming the getFragmentManager() is not the Issue, rather the popBackStack is the issue try { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } catch (Exception e) { // Recreate a new instance of your first fragment here. } } else { /* getFragmentManager() == null I have never faced an issue when getFragmentManager() == null, but I would restart the activity if that is the case */ } new Handler().postDelayed(new Runnable() { @Override public void run() { } }, 250); } });