在Java中,對象默認情況下初始化爲null
。不使用空值編寫代碼
我最近碰到這個答案出來,在做研究,妥善處理NPE:https://softwareengineering.stackexchange.com/a/187225
以下是從後我的主要外賣:
如果你從來沒有設置一個變量爲null你永遠不會有意外的空。
不允許空參數
我一直想知道如何用Java和Android處理這個問題。我在開發人員儀表板上看到的許多崩潰報告都是NPE,而且我注意到在我的代碼中,我使用null
檢查以查看是否可以繼續操作。
我梳理通過我的代碼庫試圖刪除null
和默認實例儘可能的,但我運行到這個地方出現不可能幾個領域,我不知道如何解決它的錯誤來自這些變量。
例如,使用Google Maps API時,必須聲明GoogleMap
對象。我目前設置的方式是將變量聲明爲我的Activity
的成員,然後在onCreate()
期間初始化它。不幸的是,在onResume()
期間,我撥打.clear()
上GoogleMap
,偶爾該字段將是null
。我無法在自己的環境中重現這個錯誤,這導致我在處理NPE時做了更多的閱讀。
在另一個(非常受歡迎)的問題在這裏:Avoiding != null statements,頂部和接受的答案建議三個策略來解決這個問題。
assert
聲明。從表面上看,這看起來更像是單元測試/調試代碼,特別是因爲Java在默認情況下忽略了assert
。- 空對象模式。這可能是提出的解決方案中最具吸引力的解決方案,因爲它最終看起來更加清爽。但是,在使用外部庫時,我不確定這是否是一種選擇。擴展一個外部庫看起來很麻煩。
- try/catch。這很困難。由於
null
在Java中非常普遍,所以代碼最終會緊密結合try/catch來處理可能爲null的所有內容,或者最終導致大量代碼被阻止,而捕獲錯誤將無法保證處理善後事宜的精度。
我的問題是,有沒有另一種選擇?也許我可以使用的編碼範例或某種內置的解決方案可以解決這個問題?
理想情況下,我想要一個解決方案,我不會崩潰,失去數據可靠性或失去應用程序功能。
注意 - 這不是關於我的代碼問題的問題,這是一個關於如何防守編寫代碼,以防止意外NPE在默認初始化null
一個語言問題。
此外,請檢查Java 8中引入的(最終)[可選的](構造)「構造」 –
爲什麼要清除地圖會使它爲空? @ɐuıɥɔɐɯ不是Android的專家,但不知道您可以在Android SDK中使用此工具 – Dici
清除地圖不會使其爲空。出於某種原因,偶爾地,當達到'.clear()'語句時,map *已經是null *。 – nukeforum