詳解Java如何有效避免空指針
其實在阿里巴巴的《Java開發(fā)手冊》里邊,空指針,也就是NullPointerException
簡稱NPE的,怕一下子寫出NPE,部分的伙伴看不懂,索性就改成了空指針。下文的空指針異常,我們用NPE
表示。
在實際的開發(fā)中,我們最討厭的就是遇到空指針了,業(yè)務(wù)跑著跑著發(fā)現(xiàn)了空指針。通過shigen
的總結(jié),多數(shù)的空指針都是從數(shù)據(jù)庫中帶來的,在這篇文章中,shigen
就有講到盡可能用not null定義字段。
但是,所有的這些都是理想的狀態(tài),并不是每個人或者每個開發(fā)團隊都會遵守這個規(guī)約的。遇到這樣的項目,我們除了去改也沒有辦法。除了用java8的新特性Option
外,shigen
也寫了一個工具類,實現(xiàn)了空指針的控制問題。那就先來看看代碼吧。
public class ObjectUtil { ? /** * 把對象中的 String 類型的null字段,轉(zhuǎn)換為空字符串 * * @param <T> 待轉(zhuǎn)化對象類型 * @param object 待轉(zhuǎn)化對象 * @param fieldName 字段名字 */ public static <T> void noNullStringAttr(T object, String fieldName) { Field[] fields = object.getClass().getDeclaredFields(); if (fields.length == 0) { return; } for (Field field : fields) { if ("String".equals(field.getType().getSimpleName())) { field.setAccessible(true); try { Object value = field.get(object); if (value == null && field.getName().equals(fieldName)) { field.set(object, ""); } } catch (IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); } } } } }
這個代碼其實就是用到了范型,我們傳入對應(yīng)的對象和對象的屬性名字,通過反射獲得字段的值,如果字段的值是空的,就讓字段的值設(shè)置成空字符串,而不是null
。這樣,我們在使用的時候就會很好的避免到空指針的問題。
當然,我們的方法也可以稍微改造一下,直接把字段值為空的字段設(shè)置成默認值或者其它值,這個都是可以進一步的優(yōu)化的。還是那句話:具體問題具體分析。
那使用起來也很簡單,先看我怎么使用的吧。
public static void main(String[] args) { // 構(gòu)造參數(shù):status, msg, data Result<Object> result = new Result<>(200, null, null); ObjectUtil.noNullStringAttr(result, "msg"); System.out.println(result); ? User user = new User().setUsername("abc").setPassword(null); ObjectUtil.noNullStringAttr(user, "password"); System.out.println(user); ? ObjectUtil.noNullStringAttr(user, "username"); System.out.println(user); }
輸出是這樣的:
如果有值,我們就不管,沒有值,就把字段的值設(shè)置成空字符串。
當然,用反射的方式也會破壞對象的結(jié)構(gòu),造成性能的損耗。哎,只是一個補救的辦法,還是能規(guī)范就規(guī)范起來,這樣才能解決很多不必要的麻煩。
以上就是詳解Java如何有效避免空指針的詳細內(nèi)容,更多關(guān)于Java避免空指針的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot 項目中的圖片處理策略之本地存儲與路徑映射
在SpringBoot項目中,靜態(tài)資源存放在static目錄下,使得前端可以通過URL來訪問這些資源,我們就需要將文件系統(tǒng)的文件路徑與URL建立一個映射關(guān)系,把文件系統(tǒng)中的文件當成我們的靜態(tài)資源即可,本文給大家介紹SpringBoot本地存儲與路徑映射的相關(guān)知識,感興趣的朋友一起看看吧2023-12-12Java JVM字節(jié)碼指令集總結(jié)整理與介紹
本節(jié)將會著重介紹一下JVM中的指令集、Java是如何跨平臺的、JVM指令集參考手冊等內(nèi)容。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Spring?Security?基于URL的權(quán)限判斷源碼解析
這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問題,我們想要實現(xiàn)自己的基于請求Url的授權(quán)只需自定義一個?AccessDecisionManager即可,接下來跟隨小編一起看看實現(xiàn)代碼吧2021-12-12Java實現(xiàn)Fibonacci(斐波那契)取余的示例代碼
這篇文章主要介紹了Java實現(xiàn)Fibonacci取余的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03SpringBoot:JPA + AuditingEntityListener時區(qū)設(shè)置方式
這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時區(qū)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Spring?Cloud?Gateway?遠程代碼執(zhí)行漏洞(CVE-2022-22947)的過程解析
Spring?Cloud?Gateway?是基于?Spring?Framework?和?Spring?Boot?構(gòu)建的?API?網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡單、有效、統(tǒng)一的?API?路由管理方式,這篇文章主要介紹了Spring?Cloud?Gateway?遠程代碼執(zhí)行漏洞(CVE-2022-22947),需要的朋友可以參考下2022-08-08