NullPointerException relacionado con FragmentManager.popBackStack. ¿Cómo resolver?

Tengo una aplicación de Android donde tengo una actividad y una pila de fragmentos.

Utilizando Crashlytics, he recibido una sola instancia de la siguiente 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) 

El código que produce este error es:

 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); } }); 

Sobre la base de las pruebas que he realizado con esta aplicación, el usuario para el que se produjo esta excepción y el hecho de que sólo se ha producido una vez, estoy pensando que esta Exception produce cuando se produce alguna extraña consolidación de circunstancias. (Básicamente, no puedo reproducir esta Exception en mi final.) Estoy asumiendo que esto tiene que ver con el usuario de fondo de mi aplicación y luego reanudarlo en un momento posterior, y luego la llamada getFragmentManager() devuelve un null .

Por lo tanto, sé que puedo "arreglar" esto con un código como el siguiente (encontrado esto como una corrección aplicada a un repositorio de GitHub):

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

Aunque me doy cuenta de que el código anterior "arreglará" el problema en que evitará el NPE , (por lo tanto, detener la aplicación de estrellarse), no realmente "solucionar" el problema al permitir que mi aplicación para funcionar como desee. El Fragment en cuestión es # 3 en una pila de fragmentos, como este:

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

El comportamiento deseado para la aplicación es responder a este botón haciendo clic en haciendo estallar de nuevo al Fragment # 1 siendo visible. Simplemente añadir en el código anterior parece que mantendría la aplicación de estrellarse, pero no cambiar la interfaz de usuario de la aplicación de la manera deseada.

¿Qué estoy haciendo mal de tal manera que cuando mi aplicación se reanuda, es "estado de fragmento" está fuera de control?

Nunca he hecho frente a un problema con el getFragmentManager () que es null así que estoy asumiendo que es la parte del popBack de la declaración que está causando el problema. Aquí hay una solución posible para evitar un bloqueo y manejar las excepciones. Si sólo ocurrió una vez, puede haber sido un caso raro.

 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); } }); 
  • Cómo capturar excepciones generadas con código nativo que se ejecuta en Android
  • NullPointerException en BoringLayout.isBoring no es nada aburrido
  • ¿Por qué mi contexto en mi Fragmento es nulo?
  • GMail para KitKat se bloquea al enviar archivos adjuntos que no son imágenes o videos
  • DialogFragment: NullPointerException (biblioteca de soporte)
  • La inspección muestra la excepción de puntero nulo mientras compruebo la probabilidad nula
  • NullPointerException al crear un nuevo cuadro de diálogo
  • Android 4.0.3 ScrollingTabContainerView NullPointerException
  • ¿Por qué se arroja NPE al finalizar Actividad?
  • Cómo pasar el contexto de la aplicación dentro Singleton y SharedPreferences Clases
  • NullPointerException en handleOnGetSentenceSuggestionsMultiple (SpellCheckerSession)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.