日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

防止NullPointerException,是程序员的基本修养

發(fā)布時間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 防止NullPointerException,是程序员的基本修养 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果一個Java程序到處拋出NullPointerException,那么我們可能會各種吐槽代碼的質(zhì)量。但是我們的項目又經(jīng)常會拋出空指針異常,空指針異常必然常伴Java程序員。為此我們需要了解一些它嘍,NullPointerException是Java中一個常見的RuntimeException,正如阿里的Java開發(fā)手冊所說,對于Java程序員來說防止NPE是一種基本素養(yǎng)。今天我們盤一下NullPointerException。

1 NullPointerException以及其產(chǎn)生的場景

Java中定義:在應用程序中嘗試使用null時會拋出異常。

其中以下的情況會產(chǎn)生NullPointerException

  • 調(diào)用空對象的方法,
  • 訪問或者修改對象的字段值時
  • 獲取一個空對象(數(shù)組)的長度時,
  • 修改或者回取null數(shù)組的一個元素或者值時
  • 拋出異常時,拋出null。
  • 以上是針對各種具體發(fā)生異常的情況,而對于日常使用過程中,可能拋出空指針異常的情景非常多,我們常用的手冊中提到了以下幾種NPE產(chǎn)生的實際使用場景。

    • 返回類型為基本數(shù)據(jù)類型,return包裝數(shù)據(jù)類型的對象時,自動拆箱有可能產(chǎn)生NPE。
    • 數(shù)據(jù)庫的查詢結(jié)果可能為null。
    • 集合里的元素即使isNotEmpty,取出的數(shù)據(jù)元素也可能為null。
    • 遠程調(diào)用返回對象時,一律要求進行空指針判斷,防止NPE。
    • 對于Session中獲取的數(shù)據(jù),建議進行NPE檢查,避免空指針。
    • 級聯(lián)調(diào)用obj.getA().getB().getC();一連串調(diào)用,易產(chǎn)生NPE。

    自動拆箱的NPE

    如下代碼中,代碼邏輯出現(xiàn)問題的話,返回就是null。

    public int count(){Integer integer = null;。。。。。。return integer; }

    同理如下代碼也是同樣的問題,均屬于自動拆裝箱時的NPE問題。

    public static Boolean callSuccess(){return null;};

    從集合取出的值直接使用會遇到NPE.

    Map<String,String> map= new HashMap<>(); map.get("test").equals("test");

    2 NPE處理以及如何避免

    一般程序中需要處理NPE的地方隨處可見,常見的NPE預防介紹如下幾種方法。

    2.1 如果是鏈式get這種推薦使用Optional進行處理

    如下代碼

    public class Department {private String departmentName;private Company company;... } public class Group {private Department department;... } public class Employee {private String staffName;private Group group;... }

    如果程序中需要如此調(diào)用

    employee.getGroup().getDepartment().getDepartmentName();

    那么每一處均可能出現(xiàn)NullPointerException,如果我們寫成下面這樣。

    if (employee != null){if(employee.getGroup() != null){if(employee.getGroup().getDepartment() != null){String departmentName = employee.getGroup().getDepartment().getDepartmentName();}} }

    if嵌套大軍來襲,爾等還不下馬受死。

    上述if嵌套看起來的確很不美觀,使用Optional可以比較容易的避免這些if判斷,代碼也會優(yōu)雅不少。

    下面不管哪一層為null返回均為Default。

    String s = Optional.ofNullable(employee).map(Employee::getGroup).map(Group::getDepartment).map(Department::getDepartmentName).orElse("Default");

    或者使用如下方法,如果某一層為null則返回Supplier的執(zhí)行結(jié)果。

    String s1 = Optional.ofNullable(employee).map(Employee::getGroup).map(Group::getDepartment).map(Department::getDepartmentName).orElseGet(() -> {return "Supplier default";});

    2.2 主動進行參數(shù)檢查,對方法中傳入的參數(shù)進行檢驗

    大部分的源碼中使用的基礎檢查均會檢查null

    public static String testString(String str) throws Exception {if (str == null){throw new Exception("param can't be null");}return str; }

    2.3 在已知字符串上使用equals(),equalsIgnoreCase()等方法。

    "knownObject".equals(unknownObject)

    2.4 盡量避免方法中返回null

    一些返回數(shù)組或者List的方法,如果沒有值,盡量返回空集合,避免返回null。

    2.5 新版本中Java輸出的NullPointException詳細信息

    Java14 可以使用增強異常信息來查看NullPointerException的詳細錯誤信息。Java17已經(jīng)默認開啟。

    java -XX:+ShowCodeDetailsInExceptionMessages NPTDemo

    使用Java17執(zhí)行如下語句及NullPointException的輸出

    Map<String,String> map= new HashMap<>(); map.get("test").equals("test"); E:\Java\jdk-17.0.1\bin>java NPTDemo Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "java.util.Map.get(Object)" is nullat NPTDemo.main(NPTDemo.java:24)

    總結(jié)

    記住一句話:避免空指針異常的最好的方法就是總是檢查哪些不是自己創(chuàng)建的對象。

    Java新版本中的NullPointException的詳細信息的輸出對我們定位錯誤幫助很大,也是一個強有力的問題排查方法。

    總結(jié)

    以上是生活随笔為你收集整理的防止NullPointerException,是程序员的基本修养的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。