0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 17:14 ? 次閱讀

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

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

Java中定義:在應(yīng)用程序中嘗試使用null時(shí)會(huì)拋出異常。

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

  1. 調(diào)用空對(duì)象的方法,
  2. 訪問或者修改對(duì)象的字段值時(shí)
  3. 獲取一個(gè)空對(duì)象(數(shù)組)的長(zhǎng)度時(shí),
  4. 修改或者回取null數(shù)組的一個(gè)元素或者值時(shí)
  5. 拋出異常時(shí),拋出null。

以上是針對(duì)各種具體發(fā)生異常的情況,而對(duì)于日常使用過程中,可能拋出空指針異常的情景非常多,我們常用的手冊(cè)中提到了以下幾種NPE產(chǎn)生的實(shí)際使用場(chǎng)景。

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

自動(dòng)拆箱的NPE

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

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

同理如下代碼也是同樣的問題,均屬于自動(dòng)拆裝箱時(shí)的NPE問題。

public static Boolean callSuccess(){
    return null;

};

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

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

2 NPE處理以及如何避免

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

2.1 如果是鏈?zhǔn)絞et這種推薦使用Optional進(jìn)行處理

如下代碼

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判斷,代碼也會(huì)優(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 主動(dòng)進(jìn)行參數(shù)檢查,對(duì)方法中傳入的參數(shù)進(jìn)行檢驗(yàn)

大部分的源碼中使用的基礎(chǔ)檢查均會(huì)檢查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

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

2.5 新版本中Java輸出的NullPointException詳細(xì)信息

Java14 可以使用增強(qiáng)異常信息來查看NullPointerException的詳細(xì)錯(cuò)誤信息。Java17已經(jīng)默認(rèn)開啟。

java -XX:+ShowCodeDetailsInExceptionMessages NPTDemo

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

Map< String,String > map= new HashMap<  >();
map.get("test").equals("test");
E:Javajdk-17.0.1bin >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 null
        at NPTDemo.main(NPTDemo.java:24)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6715

    瀏覽量

    88308
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67765
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3198

    瀏覽量

    57360
  • null
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    3890
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCBA焊點(diǎn)氣泡的危害及其產(chǎn)生原因分析

    PCBA焊點(diǎn)氣泡(空洞)的危害及其產(chǎn)生原因分析
    的頭像 發(fā)表于 01-05 14:18 ?1398次閱讀
    PCBA焊點(diǎn)氣泡的危害<b class='flag-5'>及其</b><b class='flag-5'>產(chǎn)生</b>原因分析

    闡述BUCK電路損耗產(chǎn)生及其估算算法

    PART1:前言本文以一個(gè)12V-2.5V/2A的DC-DC電源為例,闡述BUCK電路損耗產(chǎn)生及其估算算法。先做以下幾點(diǎn)聲明:1、開關(guān)電源的主功率開關(guān)管的工作區(qū)域:開區(qū)和關(guān)區(qū),實(shí)際上是線性區(qū)
    發(fā)表于 07-27 07:55

    STM32的SPWM產(chǎn)生的原理及其過程是怎樣的

    SPWM的原理和調(diào)制方法是什么?STM32的SPWM產(chǎn)生的原理及其過程是怎樣的?
    發(fā)表于 02-17 07:15

    是否有任何針對(duì) EVK 的測(cè)試套件或針對(duì)各種平臺(tái)及其相關(guān)場(chǎng)景的各自出廠配置值?

    對(duì)于各種 IMX 系列處理器 (IMX 3/5/6),在 SD/MNC 主機(jī)控制器中可以實(shí)現(xiàn)的最大有效吞吐量是多少? 是否有任何針對(duì) EVK 的測(cè)試套件或針對(duì)各種平臺(tái)及其相關(guān)場(chǎng)景的各自出廠配置值?
    發(fā)表于 06-05 06:27

    超結(jié)理論的產(chǎn)生與發(fā)展及其對(duì)高壓MOSFET器件設(shè)計(jì)的影響

    摘 要: 對(duì)超結(jié)理論的產(chǎn)生背景及其發(fā)展過程進(jìn)行了介紹。以應(yīng)用超結(jié)理論的COOLMOSTM 器件為例,介紹了超結(jié)器件的工作原理、存在的缺點(diǎn)以及提出的改進(jìn)方法;并對(duì)其他基于超結(jié)
    發(fā)表于 11-14 15:32 ?0次下載

    風(fēng)暖加熱器油煙味產(chǎn)生的原因及其改進(jìn)方法

    簡(jiǎn)要介紹風(fēng)暖加熱器油煙味產(chǎn)生的原因及其改進(jìn)方法。關(guān)鍵詞: 加熱器; 油煙味; 產(chǎn)生原因; 改進(jìn)方法Abstract: The author briefly introduces the causes that the heate
    發(fā)表于 07-25 09:40 ?22次下載

    超結(jié)理論的產(chǎn)生與發(fā)展及其對(duì)高壓MOSFET器件設(shè)計(jì)的影響

    超結(jié)理論的產(chǎn)生與發(fā)展及其對(duì)高壓MOSFET器件設(shè)計(jì)的影響:對(duì)超結(jié)理論的產(chǎn)生背景及其發(fā)展過程進(jìn)行了介紹。以應(yīng)用超結(jié)理論的COOLMOSTM 器件為例,介紹了超結(jié)器件的工作原理、存在的缺
    發(fā)表于 12-13 19:57 ?31次下載

    緩慢加燈絲技術(shù)的應(yīng)用及其產(chǎn)生的經(jīng)濟(jì)效益

    緩慢加燈絲技術(shù)的應(yīng)用及其產(chǎn)生的經(jīng)濟(jì)效益:對(duì)于使用大功率電子管發(fā)射臺(tái)來講,由于電子管的特點(diǎn)是功率大、線性好。但是它的不足是耗電量大,使用壽命短,價(jià)格昂貴。往往一
    發(fā)表于 12-15 10:21 ?19次下載

    脈沖產(chǎn)生和整形電路典型例題及其講解

    脈沖產(chǎn)生和整形電路典型例題及其講解 例6.1 用集成芯片555構(gòu)成的施密特觸發(fā)器電路及輸入波形Vi如圖6.3(a、b)所示,試畫出對(duì)應(yīng)的輸出波形Vo
    發(fā)表于 04-22 16:53 ?42次下載

    脈沖超聲波的產(chǎn)生及其特點(diǎn)

    脈沖超聲波的產(chǎn)生及其特點(diǎn) 用于產(chǎn)生和接收超聲波的材料一
    發(fā)表于 11-24 14:53 ?7569次閱讀
    脈沖超聲波的<b class='flag-5'>產(chǎn)生</b><b class='flag-5'>及其</b>特點(diǎn)

    諧波的產(chǎn)生原因及其危害介紹

    諧波的產(chǎn)生及其危害介紹 一、概述    在理想的情況下,優(yōu)質(zhì)的電力供應(yīng)應(yīng)該提供具有正弦波形的電壓。但在實(shí)際中供電電壓的波形會(huì)由于某些原因而偏離正弦波形
    發(fā)表于 04-08 17:44 ?1.5w次閱讀

    高頻開關(guān)電源中EMI產(chǎn)生的機(jī)理及其抑制方法

    本文從開關(guān)電源的電路結(jié)構(gòu)、器件進(jìn)行分析,探討了電磁干擾產(chǎn)生的機(jī)理及其抑制方法。
    發(fā)表于 07-12 15:10 ?4739次閱讀
    高頻開關(guān)電源中EMI<b class='flag-5'>產(chǎn)生</b>的機(jī)理<b class='flag-5'>及其</b>抑制方法

    永磁同步電機(jī)直接轉(zhuǎn)矩控制轉(zhuǎn)矩脈動(dòng)的產(chǎn)生及其抑制方法綜述

    永磁同步電機(jī)直接轉(zhuǎn)矩控制轉(zhuǎn)矩脈動(dòng)的產(chǎn)生及其抑制方法綜述
    發(fā)表于 01-21 12:00 ?2次下載

    Java14處理NullPointerException新方式

    1.傳統(tǒng)的 NullPointerException 2.增強(qiáng)型 NullPointerException 2.1 詳細(xì)的異常信息 3. 技術(shù)方面 在Java語言中,處理空指針往往是一件很頭疼的事情
    的頭像 發(fā)表于 10-11 17:56 ?747次閱讀

    FPGA和ASIC的概念、基本組成及其應(yīng)用場(chǎng)景 FPGA與ASIC的比較

      FPGA和ASIC都是數(shù)字電路的實(shí)現(xiàn)方式,但它們有不同的優(yōu)缺點(diǎn)和應(yīng)用場(chǎng)景。本文將以通俗易懂的方式解釋FPGA和ASIC的概念、基本組成、及其應(yīng)用場(chǎng)景
    發(fā)表于 08-14 16:37 ?2012次閱讀