2016-02-06 13 views
7

Bir etkinliğim ve bir parça yığınım olduğu bir Android uygulamasına sahibim.NullPointerException. Nasıl çözülür?

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) 

Bu hata üretir kodu: Crashlytics kullanarak

, aşağıdaki Exception tek bir örneğini almış bu yapmış test dayanarak

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

Uygulama, bu Özel Durumun oluştuğu kullanıcı ve yalnızca bir kez gerçekleşmiş olan gerçek, koşulların bazı garip bir şekilde bir araya gelmesi durumunda bu Exception'un oluştuğunu düşünüyorum. (Temel olarak, bu Exception yeniden üretemiyorum.) Uygulamamın arkaplanı uygulamamı ve daha sonra tekrar devam etmesi gerektiğini varsayarak, getFragmentManager() aramasının null değerini döndürdüğünü kabul ediyorum.

Yani, ben (bir GitHub deposuna uygulanan düzeltme olarak buldum) Aşağıdaki gibi kodla Bu "düzeltme" biliyor:

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

ben kod yukarıdaki "çözecektir fark ederken "Bu sorunu NPE, (böylece uygulamayı çökmesini durdurarak) önleyecektir, bu benim app istediği gibi çalışmasına izin vererek sorunu" düzeltmek "değil. Söz konusu Fragment böyle, parçaların bir yığın içerisinde 3'tür:

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

uygulaması için istenen davranışı görünür olma Fragment 1. geri kahpeden bu düğmeye tıklama cevap etmektir. Yukarıdaki kodda yalnızca ekleme, uygulamanın kilitlenmesini engelliyor gibi görünüyor, ancak uygulamanın kullanıcı arayüzünü istenen şekilde değiştirmiyor.

Uygulamam tekrar başladığında, "parçalanma durumu" patlak vermeyecek şekilde ne yapıyorum?

+1

Tam olarak aynı sorunu yaşıyorum, parçayı kapatmak ve bir öncekine geri dönmek için bir düğmeyle getFragmentManager(). PopBackStack() öğesini çağırıyorum. Ben de onu üretemiyorum ama hata gerçek bir sorun olmak için yeterince sık. –

+0

Bu sorunla karşı karşıyayım bir çözüm buldunuz mu? –

cevap

0

Hiçbir zaman, getFragmentManager() 'un null olmasıyla ilgili bir sorunla karşılaşmadım. Bu nedenle, sorunun nedenine neden olan ifadenin popBack kısmı olduğunu varsayarak kabul ediyorum. Bir çarpışmayı önlemek ve istisnaları ele almak için olası bir çözüm. Sadece bir kez olsaydı, nadir bir örnek olabilirdi.

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