2016-03-02 84 views
2

我有一個堆棧跟蹤,但不清楚哪個引用變量爲空。哪個引用變量爲空 - 嘗試從空值對象的字段'android.os.Handler android.support.v4.a.m.a'中讀取引用

嘗試從外地讀 'android.os.Handler android.support.v4.ama' 上的空對象引用

if (Looper.myLooper() != mActivity.mHandler.getLooper()) { 

(我的看法是,mActivity爲null)

  1. 靈敏度爲空?
  2. mHandler爲空?

更完整的堆棧跟蹤 - 的問題,但不是一部分..................

D/AndroidRuntime(8354): Shutting down VM 
E/AndroidRuntime(8354): FATAL EXCEPTION: main 
E/AndroidRuntime(8354): Process: za.co.nedsecure.nedbankROA.ete, PID: 8354 
E/AndroidRuntime(8354): java.lang.NullPointerException: Attempt to read from field 'android.os.Handler android.support.v4.a.m.a' on a null object reference 
E/AndroidRuntime(8354):at android.support.v4.a.s.f(FragmentManager.java:1476) 
E/AndroidRuntime(8354):at android.support.v4.a.s.b(FragmentManager.java:490) 
E/AndroidRuntime(8354):at xyz.......MainActivity.a(MainActivity.java:299) 

MainActivity代碼:

if (mainActivityWeakReference.get() != null) { 
        mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions(); 
       } 

而我的解決辦法:(我希望這是它)

if (mainActivityWeakReference.get() != null && !mainActivityWeakReference.get().isFinishing()) { 
        mainActivityWeakReference.get().getSupportFragmentManager().executePendingTransactions(); 
       } 
+0

貌似活動是等都是容易解決的問題空 – Jaguar

+1

90%通過啓動調試您的項目,自己找出來。 –

+0

如果我能重現這個問題,那麼解決起來會很容易。 – Wayne

回答

3

您必須閱讀更多的堆棧跟蹤以獲取更多線索,但真正找到這些線索的最簡單方法是將表達式跨越多行。

if (Looper 
    .myLooper() 
    != 
    mActivity 
    .mHandler 
    .getLooper()) { 

請記住在提交源代碼之前撤消此操作。

+0

這似乎是一個非常不錯的專業技巧。謝謝。 雖然問題是,這不是我的源代碼,但它是Android FragmentManger的一部分 - 包android.support.v4.app; – Wayne

+0

@Wayne - 也許如果你發佈堆棧跟蹤,我們可能會幫助更多。 – OldCurmudgeon

3

找到這個的好方法是在代碼的某處放置一個斷點(在這一行的右邊是合理的),然後評估表達式。

您可以在運行菜單中找到Evaluate Expression,或者您可以使用不同的快捷方式,這取決於您使用的是pc還是mac。

然後放入表達式並點擊Evaluate。當你找到一個返回null時,你已經發現你的問題。

因此,嘗試運行的所有可能的空的,你最終會發現:

mActivity 
mActivity.mHandler 
+0

這個關於評估表達式的提示非常有用。不幸的是,僅在幾個月前我才知道IDE中的這個特性。現在只需預覽問題代碼而不會使整個過程崩潰,調試就變得更加容易。 – jdkorv11

+0

完美....另一個專業提示!這就是我所做的,我侵入了導致堆棧跟蹤的方法 ,然後按照您的說法進行了評估。我第一次嘗試設置mHandler,但由於它標記爲最終我無法改變它。然後我嘗試將mAactive設置爲null,並生成完全相同的堆棧跟蹤結果。那麼我的猜測是,人們可以安全地認爲它是無效的毫安度。 – Wayne

相關問題