欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java如何有效避免空指針

 更新時(shí)間:2023年12月17日 11:39:53   作者:shigen01  
空指針,也就是NullPointerException 簡(jiǎn)稱(chēng)NPE的,怕一下子寫(xiě)出NPE,部分的伙伴看不懂,索性就改成了空指針,在實(shí)際的開(kāi)發(fā)中,我們最討厭的就是遇到空指針了,業(yè)務(wù)跑著跑著發(fā)現(xiàn)了空指針,所以本文詳細(xì)介紹了Java如何有效的避免空指針,需要的朋友可以參考下

其實(shí)在阿里巴巴的《Java開(kāi)發(fā)手冊(cè)》里邊,空指針,也就是NullPointerException 簡(jiǎn)稱(chēng)NPE的,怕一下子寫(xiě)出NPE,部分的伙伴看不懂,索性就改成了空指針。下文的空指針異常,我們用NPE表示。

在實(shí)際的開(kāi)發(fā)中,我們最討厭的就是遇到空指針了,業(yè)務(wù)跑著跑著發(fā)現(xiàn)了空指針。通過(guò)shigen的總結(jié),多數(shù)的空指針都是從數(shù)據(jù)庫(kù)中帶來(lái)的,在這篇文章中,shigen就有講到盡可能用not null定義字段

但是,所有的這些都是理想的狀態(tài),并不是每個(gè)人或者每個(gè)開(kāi)發(fā)團(tuán)隊(duì)都會(huì)遵守這個(gè)規(guī)約的。遇到這樣的項(xiàng)目,我們除了去改也沒(méi)有辦法。除了用java8的新特性Option外,shigen也寫(xiě)了一個(gè)工具類(lèi),實(shí)現(xiàn)了空指針的控制問(wèn)題。那就先來(lái)看看代碼吧。

 public class ObjectUtil {
 ?
     /**
      * 把對(duì)象中的 String 類(lèi)型的null字段,轉(zhuǎn)換為空字符串
      *
      * @param <T>       待轉(zhuǎn)化對(duì)象類(lèi)型
      * @param object    待轉(zhuǎn)化對(duì)象
      * @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();
                 }
             }
         }
     }
 }

這個(gè)代碼其實(shí)就是用到了范型,我們傳入對(duì)應(yīng)的對(duì)象和對(duì)象的屬性名字,通過(guò)反射獲得字段的值,如果字段的值是空的,就讓字段的值設(shè)置成空字符串,而不是null。這樣,我們?cè)谑褂玫臅r(shí)候就會(huì)很好的避免到空指針的問(wèn)題。

當(dāng)然,我們的方法也可以稍微改造一下,直接把字段值為空的字段設(shè)置成默認(rèn)值或者其它值,這個(gè)都是可以進(jìn)一步的優(yōu)化的。還是那句話(huà):具體問(wèn)題具體分析。

那使用起來(lái)也很簡(jiǎn)單,先看我怎么使用的吧。

     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);
     }

輸出是這樣的:

如果有值,我們就不管,沒(méi)有值,就把字段的值設(shè)置成空字符串。

當(dāng)然,用反射的方式也會(huì)破壞對(duì)象的結(jié)構(gòu),造成性能的損耗。哎,只是一個(gè)補(bǔ)救的辦法,還是能規(guī)范就規(guī)范起來(lái),這樣才能解決很多不必要的麻煩。

以上就是詳解Java如何有效避免空指針的詳細(xì)內(nèi)容,更多關(guān)于Java避免空指針的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 簡(jiǎn)單介紹java中equals以及==的用法

    簡(jiǎn)單介紹java中equals以及==的用法

    這篇文章主要介紹了簡(jiǎn)單介紹java中equals以及==的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 深入淺析Java反射機(jī)制

    深入淺析Java反射機(jī)制

    Java反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類(lèi),都能夠知道這個(gè)類(lèi)的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱(chēng)為Java語(yǔ)言的反射機(jī)制
    2015-11-11
  • SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射

    SpringBoot 項(xiàng)目中的圖片處理策略之本地存儲(chǔ)與路徑映射

    在SpringBoot項(xiàng)目中,靜態(tài)資源存放在static目錄下,使得前端可以通過(guò)URL來(lái)訪(fǎng)問(wèn)這些資源,我們就需要將文件系統(tǒng)的文件路徑與URL建立一個(gè)映射關(guān)系,把文件系統(tǒng)中的文件當(dāng)成我們的靜態(tài)資源即可,本文給大家介紹SpringBoot本地存儲(chǔ)與路徑映射的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2023-12-12
  • 詳解jvm中的標(biāo)量替換

    詳解jvm中的標(biāo)量替換

    這篇文章主要介紹了詳解jvm中的標(biāo)量替換,幫助大家更好的理解和使用Java虛擬機(jī),感興趣的朋友可以了解下
    2020-09-09
  • Java JVM字節(jié)碼指令集總結(jié)整理與介紹

    Java JVM字節(jié)碼指令集總結(jié)整理與介紹

    本節(jié)將會(huì)著重介紹一下JVM中的指令集、Java是如何跨平臺(tái)的、JVM指令集參考手冊(cè)等內(nèi)容。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Spring?Security?基于URL的權(quán)限判斷源碼解析

    Spring?Security?基于URL的權(quán)限判斷源碼解析

    這篇文章主要介紹了Spring?Security?基于URL的權(quán)限判斷問(wèn)題,我們想要實(shí)現(xiàn)自己的基于請(qǐng)求Url的授權(quán)只需自定義一個(gè)?AccessDecisionManager即可,接下來(lái)跟隨小編一起看看實(shí)現(xiàn)代碼吧
    2021-12-12
  • Java實(shí)現(xiàn)Fibonacci(斐波那契)取余的示例代碼

    Java實(shí)現(xiàn)Fibonacci(斐波那契)取余的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)Fibonacci取余的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式

    SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式

    這篇文章主要介紹了SpringBoot:JPA + AuditingEntityListener時(shí)區(qū)設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java自定義注解對(duì)枚舉類(lèi)型參數(shù)的校驗(yàn)方法

    Java自定義注解對(duì)枚舉類(lèi)型參數(shù)的校驗(yàn)方法

    文章介紹了如何使用Java注解對(duì)枚舉類(lèi)型參數(shù)進(jìn)行校驗(yàn),通過(guò)自定義注解和注解校驗(yàn)類(lèi)實(shí)現(xiàn)參數(shù)的靈活性校驗(yàn),感興趣的朋友一起看看吧
    2025-01-01
  • Spring?Cloud?Gateway?遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-22947)的過(guò)程解析

    Spring?Cloud?Gateway?遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-22947)的過(guò)程解析

    Spring?Cloud?Gateway?是基于?Spring?Framework?和?Spring?Boot?構(gòu)建的?API?網(wǎng)關(guān),它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單、有效、統(tǒng)一的?API?路由管理方式,這篇文章主要介紹了Spring?Cloud?Gateway?遠(yuǎn)程代碼執(zhí)行漏洞(CVE-2022-22947),需要的朋友可以參考下
    2022-08-08

最新評(píng)論