如何避免Java程式碼中的空指標錯誤NullPointerException? - foojay
根據2016年的一項研究,可怕的程式碼 (簡稱NPE)是生產中最常見的Java異常 。在本文中,我們將探討與之抗衡的主要技術:自我驗證模型和 Optional 包裝器。
自我驗證模型
想象一下業務規則:每個客戶都必須設定生日。有多種方法可以實現此約束:在建立和更新用例上驗證使用者資料,透過NOT NULL 資料庫約束強制執行 和/或在Customer實體的建構函式中實現空檢查許可權
以下是當今最常用的用於對建構函式進行空值檢查的形式:
public Customer(@NonNull Date birthDate) { // 3 assert (birthDate != null); // 4 if (birthDate == null) { // 1 throw new IllegalArgumentException(); } this.birthDate = Objects.requireNonNull(birthDate); // 2 } |
上面的程式碼包含4種 替代 方法來完成相同的事情,任何一個當然就足夠了:
- 經典 if 判斷
- 使用Java 8的檢查 java.util.Objects -在當今開發中的專案中使用最廣泛
- Lombok @NonNull 導致將 if 檢查新增到生成的位元組碼中。
- assert關鍵字:我個人不喜歡它,因為可以透過JVM引數全域性禁用斷言
如果存在出生日期的設定器,則檢查將移至該位置,而建構函式將呼叫該設定器。
在資料物件的建構函式中強制執行空檢查具有明顯的優勢:沒有人會忘記這樣做。但是,透過反射直接寫入例項欄位的框架可能會繞過此檢查。Hibernate預設情況下會執行此操作,因此我的建議是也將資料庫中相應的必需列標記為NOT NULL 確保資料返回一致。不幸的是,在必須容忍“不正確的歷史資料”的傳統系統中,問題可能變得更加複雜。
技巧:Hibernate在每個永續性實體上都需要一個無引數的建構函式,但是可以將該建構函式標記為 protected 對開發人員隱藏。
如果 null 確實是一個有效值呢?例如,假設我們的客戶可能沒有會員卡,因為她尚未建立會員卡,或者可能不想註冊會員卡。我們將在下一節討論這種情況。
Getter返回Optional
最佳實踐:由於Java 8中,每當一個函式需要返回 null,應該返回 Optional。
假設我們正在談論對映到關聯式資料庫的Entity,那麼如果您沒有NOT NULL 在相應的列上強制執行 ,則該欄位的getter應該返回 Optional。對於不提供null 保護的非持久資料物件或NoSQL資料儲存 ,上一節提供了有關如何在實體程式碼中以程式設計方式強制執行空檢查的想法。
為了簡化過渡到這種新方式的過程,可以使用以下安全步驟序列:
首先,建立第二個getter返回 Optional:
public Optional getMemberCardOpt() { return Optional.ofNullable(memberCard); } |
其次,更改原始的getter以委託給新的getter:
public String getMemberCard() { return getMemberCardOpt().orElse(null); } |
相關文章
- 如何避免空指標出錯?指標
- Java中如何避免空指標異常Java指標
- Java中的空指標異常 java.lang.NullPointerExceptionJava指標NullException
- NullPointerException空指標異常的理解NullException指標
- java.lang.NullPointerException 空指標異常問題JavaNullException指標
- [轉載] java避免空指標異常_第1部分:在現代Java應用程式中避免空指標異常Java指標
- easyexcel字型空指標錯誤Excel指標
- Java 14版本中將加入發現空指標錯誤提示功能Java指標
- Java程式設計中空指標(NullPointerException)的防範經驗分享Java程式設計指標NullException
- Java中如何處理空指標異常Java指標
- 使用Spring 的 Null-Safety免受空指標錯誤SpringNull指標
- 使用不可變Java記錄Record來避免多執行緒併發錯誤 - foojayJava執行緒
- CIO應避免的三個低程式碼部署錯誤
- Java8的Optional:如何幹掉空指標?Java指標
- 8u111-jdk-alpine在java開發中的NullPointerException錯誤解決方案JDKJavaNullException
- 聊一聊日常開發中如何優雅的避免那無處不在的空指標異常指標
- 爬蟲抓取網站有什麼技巧,要如何避免錯誤程式碼?爬蟲網站
- Python 指令碼中呼叫 Java 程式時 Classpath 錯誤Python指令碼Java
- 「程式設計師面試」一文搞懂野指標、懸空指標、空指標和記憶體洩漏,附程式碼示例!程式設計師面試指標記憶體
- 如何在 Java8 中風騷走位避開空指標異常Java指標
- Java初學者容易犯的程式碼錯誤Java
- Java 9 中的ofNullable方法 | foojayJavaNull
- Java關於空指標的防範與思考Java指標
- 1000多個專案中的十大JavaScript錯誤以及如何避免JavaScript
- 空指標的傳說指標
- 防止空指標指標
- 爬蟲錯誤程式碼如何解決?爬蟲
- java如何避免程式死鎖Java
- 5個需要避免的CSS錯誤CSS
- Java程式監控指標Java指標
- 【優雅程式碼】03-optional杜絕空指標異常指標
- Java中的七種函式程式設計技術 - foojayJava函式程式設計
- jdbc.properties報錯:java.lang.NullPointerExceptionJDBCJavaNullException
- 常見的API錯誤以及如何避免它們 - LogRocket BlogAPI
- Windows 錯誤程式碼Windows
- MySQL 錯誤程式碼MySql
- 如何避免這3 個電子郵件錯誤
- java中的引用與c中的指標Java指標