2014-09-27 120 views
1

這個讓我和我的團隊完全瘋狂。findViewById返回null TextView

我們無法複製,因爲它在我們所有的測試設備上運行良好,但是我們得到了成千上萬的崩潰報告,抱怨java.lang.NullPointerException,它是通過onCreate中的findViewById獲得的(在調用setContentView和正確的ID和佈局文件)

java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxxxxxxxxxxx.activities.PremiumActivity}: java.lang.NullPointerException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
     at android.app.ActivityThread.access$600(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4895) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
     at dalvik.system.NativeStart.main(NativeStart.java) 
Caused by: java.lang.NullPointerException 
     at xxxxxxxxx.activities.PremiumActivity.onCreate(PremiumActivity.java:258) 
     at android.app.Activity.performCreate(Activity.java:5163) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122) 
     at android.app.ActivityThread.access$600(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4895) 
     at java.lang.reflect.Method.invokeNative(Method.java) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761) 
     at dalvik.system.NativeStart.main(NativeStart.java) 

這裏是onCreate方法:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.premium_activity_layout); 
    premiumInfoHeaderTextView = (TextView) findViewById(R.id.premiumHeaderTextView); 
    int themeColor = MPThemeManager.getSharedInstance(this).themeColor(); 
    premiumInfoHeaderTextView.setTextColor(themeColor); 

最後一行是在導致空指針異常(線258)

不確定它是否可以相關,但活動延伸SherlockFragmentActivity

當然,premiumInfoHeaderTextView在onCreate方法之外被聲明爲TextView,因爲我們也在別處使用它。

+2

你有多個premium_activity_layout副本,在不同的合格文件夾? – 2014-09-27 16:02:37

+0

可能是您在不同佈局中聲明瞭多個具有相同名稱「premiumHeaderTextView」的id,並且未在premium_activity_layout中定義。所以請再次檢查。 – Yogendra 2014-09-27 16:45:29

+0

@ G.BlakeMeike只有佈局文件的一個副本。 – Erwan 2014-09-28 02:30:54

回答

3

一個瘋狂的修復一個瘋狂的錯誤!

正如我之前的評論所預期的那樣,這個錯誤來自於我們的最新版本(我們現在使用單個佈局文件)中舊版佈局xml文件(在/ res/layout-large下)在/ res/layout下)。

記得線造成空例外:

premiumInfoHeaderTextView = (TextView) findViewById(R.id.premiumHeaderTextView); 

這是由於這樣的事實,我們以前的版本的佈局沒有與ID = premiumHeaderTextView任何看法和一些藥片用戶升級誰在新版本之前,舊的佈局文件尚未被刪除,因此係統正在舊的/res/layout-large/premium_activity_layout.xml中尋找id,而不是在新的(對所有設備通用)/ res/layout /premium_activity_layout.xml

使用crashlytics瞭解所有崩潰發生在t因爲它們在升級apk時不應該保留舊的資源文件,所以這些「bug」似乎是某些平板電腦上的系統錯誤的關鍵。

因此,總之,我將/res/layout/premium_activity_layout.xml複製到/ res/layout-large,以強制平板電腦用戶使用新的佈局而不是舊的「緩存」版本。這已經完全解決了錯誤