日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

如何有效的處理空指針異常

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-30 10:25 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在編寫(xiě) Java 程序的過(guò)程中,有一種異常幾乎每個(gè)開(kāi)發(fā)者都會(huì)遇到——空指針異常(NullPointerException)。這個(gè)問(wèn)題可能會(huì)讓一些新手菜鳥(niǎo)感到困擾,甚至一些經(jīng)驗(yàn)豐富的開(kāi)發(fā)者也會(huì)不時(shí)地遇到這個(gè)問(wèn)題。

那么我們應(yīng)該如何有效且優(yōu)雅的處理空指針異常呢? 下面了不起將詳細(xì)的介紹這個(gè)處理方案。

1、什么是空指針異常?

空指針異常在 Java 中是一個(gè)運(yùn)行時(shí)錯(cuò)誤,它發(fā)生在當(dāng)我們?cè)噲D訪問(wèn)一個(gè) null 引用的成員時(shí),例如調(diào)用一個(gè) null 對(duì)象的方法或訪問(wèn)其字段。這種情況下,JVM 會(huì)拋出 NullPointerException。例如:

public class Main {
    public static void main(String[] args) {
        String str = null;
        System.out.println(str.length());  // 拋出 NullPointerException
    }
}

在這個(gè)例子中,我們?cè)噲D調(diào)用 strlength() 方法,但是 strnull,所以 JVM 拋出了 NullPointerException。

2、為什么會(huì)出現(xiàn)空指針異常?

在 Java 中,對(duì)象是通過(guò)引用來(lái)訪問(wèn)的。當(dāng)我們聲明一個(gè)對(duì)象變量時(shí),只是創(chuàng)建了一個(gè)引用,并沒(méi)有創(chuàng)建實(shí)際的對(duì)象。在使用對(duì)象之前,需要通過(guò) new 關(guān)鍵字來(lái)創(chuàng)建實(shí)際的對(duì)象,將其賦給引用。但是,如果我們沒(méi)有創(chuàng)建實(shí)際的對(duì)象,或者已經(jīng)將對(duì)象置為 null,那么再試圖使用這個(gè)引用,就會(huì)導(dǎo)致空指針異常。這是因?yàn)檫@個(gè)引用沒(méi)有指向任何實(shí)際的對(duì)象,我們不能通過(guò)它來(lái)訪問(wèn)任何成員。

例如,下面的代碼會(huì)導(dǎo)致空指針異常,因?yàn)槲覀冊(cè)噲D訪問(wèn) personname 字段,但是 personnull

public class Main {
    static class Person {
        String name;
    }

    public static void main(String[] args) {
        Person person = null;
        System.out.println(person.name);  // 拋出 NullPointerException
    }
}

3、如何預(yù)防空指針異常?

在我們開(kāi)始處理空指針異常之前,我們需要首先學(xué)會(huì)如何預(yù)防它。以下是一些預(yù)防空指針異常的常見(jiàn)策略:

  • 使用 Objects.requireNonNull() 確認(rèn)對(duì)象不為 null

Java 7 引入了一個(gè)很有用的工具類(lèi) Objects,它提供了一個(gè) requireNonNull() 方法,這個(gè)方法可以用來(lái)檢查一個(gè)對(duì)象是否為 null。如果對(duì)象是 null,它會(huì)拋出 NullPointerException。這可以幫助我們?cè)谠缙诎l(fā)現(xiàn)和處理空指針問(wèn)題。

例如:

import java.util.Objects;

public class Main {
    public static void main(String[] args) {
        String str = null;
        str = Objects.requireNonNull(str, "str cannot be null");  // 拋出 NullPointerException
    }
}
  • 在方法中對(duì)參數(shù)進(jìn)行非 null 校驗(yàn)

當(dāng)我們編寫(xiě)一個(gè)方法并期望其參數(shù)不為 null 時(shí),應(yīng)當(dāng)在方法開(kāi)始處對(duì)參數(shù)進(jìn)行非 null 校驗(yàn)。如果參數(shù)為 null,應(yīng)當(dāng)立即拋出 NullPointerExceptionIllegalArgumentException。這樣可以盡早地發(fā)現(xiàn)問(wèn)題,并避免錯(cuò)誤的進(jìn)一步傳播。

例如:

public void process(String str) {
    if (str == null) {
        throw new IllegalArgumentException("str cannot be null");
    }

    // ...
}
  • 使用 Optional 類(lèi)來(lái)更優(yōu)雅地處理可能為 null 的情況

Java 8 引入了一個(gè)新的類(lèi) Optional,它是一個(gè)可以包含也可以不包含值的容器對(duì)象。Optional 提供了一種更優(yōu)雅、更安全的方式來(lái)處理可能為 null 的情況,而無(wú)需顯式地進(jìn)行 null 檢查。我們會(huì)在后面的部分詳細(xì)討論 Optional 的使用。

除了上述技術(shù)之外,也有一些通用的編程最佳實(shí)踐可以幫助我們避免空指針異常。例如,我們應(yīng)當(dāng)盡量減少 null 的使用,盡量不要返回 null,可以考慮使用空對(duì)象或默認(rèn)對(duì)象。在對(duì)輸入?yún)?shù)進(jìn)行處理時(shí),我們應(yīng)當(dāng)總是假設(shè)輸入可能為 null 并進(jìn)行相應(yīng)的處理。

4、如何捕獲和處理空指針異常?

雖然我們已經(jīng)知道了如何預(yù)防空指針異常,但是在某些情況下,我們可能還是需要捕獲和處理這個(gè)異常。Java 提供了 try/catch 語(yǔ)句來(lái)捕獲和處理異常,包括空指針異常。

下面是一個(gè)例子:

public class Main {
    public static void main(String[] args) {
        try {
            String str = null;
            System.out.println(str.length());  // 會(huì)拋出 NullPointerException
        } catch (NullPointerException e) {
            System.out.println("Caught a NullPointerException.");
            // 我們可以在這里處理異常,例如提供一個(gè)默認(rèn)值
            // ...
        }
    }
}

在這個(gè)例子中,我們使用 try 塊包圍了可能拋出空指針異常的代碼。如果 try 塊中的代碼拋出了空指針異常,那么控制流就會(huì)立即轉(zhuǎn)到 catch 塊,我們可以在 catch 塊中處理這個(gè)異常。

雖然 try/catch 是一個(gè)強(qiáng)大的工具,但是我們應(yīng)當(dāng)謹(jǐn)慎使用它。不應(yīng)該用 try/catch 來(lái)替代良好的編程實(shí)踐和合理的 null 檢查。過(guò)度使用 try/catch 可能會(huì)使代碼變得混亂,難以閱讀和維護(hù),也可能會(huì)隱藏真正的問(wèn)題。

5、Java 8 Optional 類(lèi)的使用

如前所述,Java 8 引入了 Optional 類(lèi)來(lái)幫助開(kāi)發(fā)者更優(yōu)雅地處理可能為 null 的情況。Optional是一個(gè)可以包含也可以不包含值的容器對(duì)象。當(dāng)我們期望一個(gè)方法可能返回 null 時(shí),可以考慮讓它返回 Optional 對(duì)象,這樣調(diào)用者就可以更方便地檢查返回值是否為 null。

下面是一個(gè)例子:

import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        Optional< String > optional = getOptional();
        if (optional.isPresent()) {
            System.out.println(optional.get());
        } else {
            System.out.println("No value present");
        }
    }

    static Optional< String > getOptional() {
        // ...
        return Optional.empty();  // 返回一個(gè)不包含值的 Optional
    }
}

在這個(gè)例子中,getOptional() 方法返回一個(gè) Optional。調(diào)用者可以使用 isPresent()方法來(lái)檢查 Optional 是否包含值,然后使用 get() 方法來(lái)獲取值。這樣就可以避免了空指針異常。

6、編程最佳實(shí)踐

下面是了不起給大家整理的處理空指針異常的最佳編程實(shí)踐。

  • 對(duì)輸入?yún)?shù)進(jìn)行校驗(yàn)
    在處理方法參數(shù)之前,總是檢查其是否為 null。如果方法不接受 null 參數(shù),應(yīng)該立即返回或拋出異常。
  • 盡量避免返回 null
    如果方法可能返回 null,考慮返回 Optional 類(lèi)型,或者返回一個(gè)空對(duì)象或默認(rèn)對(duì)象。這樣可以避免調(diào)用者直接處理 null。
  • 鼓勵(lì)使用空對(duì)象或默認(rèn)對(duì)象,而非 null
    空對(duì)象(也稱(chēng)為 Null 對(duì)象)或默認(rèn)對(duì)象是一種設(shè)計(jì)模式,可以在沒(méi)有數(shù)據(jù)的情況下提供默認(rèn)的行為。使用空對(duì)象或默認(rèn)對(duì)象可以簡(jiǎn)化代碼,避免需要檢查 null
  • 盡可能減少 null 的使用
    盡管 null 在 Java 中是不可避免的,但是我們應(yīng)當(dāng)盡量減少 null 的使用。過(guò)度使用 null 會(huì)導(dǎo)致代碼難以理解和維護(hù),并增加出錯(cuò)的可能性。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    3012

    瀏覽量

    116874
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3724

    瀏覽量

    97458
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    536

    瀏覽量

    23033
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

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

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74419
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    SMT貼片異常

    SMT廠使用我們同款產(chǎn)品在三種不同機(jī)種上皆出現(xiàn)焊現(xiàn)象,我們對(duì)不良品進(jìn)行EDX分析,無(wú)異常;對(duì)同批次樣品上錫實(shí)驗(yàn)無(wú)異常;量測(cè)產(chǎn)品尺寸(產(chǎn)品高度、焊盤(pán)大小、鍍層厚度)無(wú)異常,可能是什么原
    發(fā)表于 01-08 11:50

    指針指針的兩個(gè)小點(diǎn)

    大家都知道指針的學(xué)習(xí)對(duì)于c語(yǔ)言學(xué)習(xí)來(lái)說(shuō)可謂是至關(guān)重要的,下面我們來(lái)說(shuō)一下在指針中兩種比較特殊的關(guān)于指針的概念,野指針
    發(fā)表于 10-14 15:56

    函數(shù)指針的問(wèn)題

    您好。我把函數(shù)指針作為參數(shù)傳遞給函數(shù)時(shí)遇到了一些問(wèn)題。問(wèn)題基本上是在一些循環(huán)下,函數(shù)指針的。最后檢查代碼和注釋?zhuān)?):(1)這是關(guān)鍵。如果我不使用這個(gè)句子,“數(shù)據(jù)”指針總是
    發(fā)表于 08-24 15:49

    【設(shè)計(jì)技巧】指針的使用注意事項(xiàng):指針指針賦值、void *指針

    *)型。所以說(shuō),void類(lèi)型指針是 傳遞參數(shù)的利器。 void型指針只能用于指針的傳送,不能直接使用,我們傳遞完void類(lèi)型指針后,當(dāng)我們要具體使用它的時(shí)候,必須必須必須將該
    發(fā)表于 08-20 08:30

    Java異常體系級(jí)處理辦法

    ;  CheckException:已檢查異常,編譯階段必須處理;  幾個(gè)經(jīng)典的常見(jiàn)的RunTimeException如下:指針NullPointerException;數(shù)組下標(biāo)越界
    發(fā)表于 01-05 17:48

    DevEco Studio打開(kāi)歷史工程報(bào)指針錯(cuò)誤怎么解決?

    DevEco Studio打開(kāi)歷史工程報(bào)指針錯(cuò)誤
    發(fā)表于 04-12 11:48

    DevEco Studio打開(kāi)歷史工程報(bào)指針錯(cuò)誤是為什么?

    DevEcoStudio打開(kāi)歷史工程報(bào)指針錯(cuò)誤
    發(fā)表于 06-10 10:21

    為什么程序中會(huì)出現(xiàn)指針?

    為什么程序中會(huì)出現(xiàn)指針
    發(fā)表于 10-10 07:25

    指針引用缺陷分類(lèi)假陽(yáng)性識(shí)別方法

    針對(duì)靜態(tài)測(cè)試中空指針引用缺陷假陽(yáng)性問(wèn)題,提出一種指針引用缺陷分類(lèi)假陽(yáng)性識(shí)別方法。挖掘指針引用缺陷知識(shí),對(duì)空
    發(fā)表于 11-25 11:04 ?8次下載
    <b class='flag-5'>空</b><b class='flag-5'>指針</b>引用缺陷分類(lèi)假陽(yáng)性識(shí)別方法

    指針變量, 位帶指針 ,LSB最低有效位 ······

    指針變量,位帶指針,LSB最低有效位······
    的頭像 發(fā)表于 03-08 11:53 ?3519次閱讀

    你們知道指針和引用正確的使用場(chǎng)景嗎

    重新起了一個(gè)名字,引用也就是“別名”。 不同之處 ◆ 指針在聲明時(shí)可以暫時(shí)不初始化,當(dāng)然每次使用指針時(shí)都要做檢查,以防出現(xiàn)指針異常的問(wèn)題0
    的頭像 發(fā)表于 09-02 14:37 ?2718次閱讀
    你們知道<b class='flag-5'>指針</b>和引用正確的使用場(chǎng)景嗎

    指針和引用的區(qū)別及使用場(chǎng)景介紹

    指針在聲明時(shí)可以暫時(shí)不初始化,即pointer = nullptr,指針在生命周期內(nèi)隨時(shí)都可能是指針,所以在每次使用時(shí)都要做檢查,防止出現(xiàn)
    的頭像 發(fā)表于 03-11 10:24 ?2451次閱讀

    懸空指針能不能訪問(wèn)?

    指針被釋放后,是不是就變成了指針?這是很多剛接觸指針的同學(xué)存在的誤區(qū)。
    的頭像 發(fā)表于 08-17 17:11 ?1399次閱讀
    懸空<b class='flag-5'>指針</b>能不能訪問(wèn)?

    bigdecimal轉(zhuǎn)string類(lèi)型避免指針

    指針異常的發(fā)生。本文將詳細(xì)介紹如何將BigDecimal對(duì)象轉(zhuǎn)換為String類(lèi)型,以及如何避免指針
    的頭像 發(fā)表于 11-30 11:12 ?4323次閱讀

    指針被釋放后就變成了指針

    指針被釋放后,是不是就變成了指針?有好多同學(xué)提出了這樣的問(wèn)題。 借用《C專(zhuān)家編程》上面的一段代碼,可以很好的解釋這個(gè)問(wèn)題。 ? ? #include int main(){ char *s
    的頭像 發(fā)表于 01-22 09:23 ?928次閱讀
    桂林市| 宁南县| 临清市| 漯河市| 舒城县| 桓仁| 建水县| 榆中县| 怀柔区| 丹阳市| 青神县| 阳江市| 九江县| 高邑县| 肃南| 湖北省| 武城县| 米林县| 平定县| 平安县| 武夷山市| 佛教| 舒城县| 仪征市| 广州市| 图木舒克市| 滦平县| 双辽市| 邹城市| 刚察县| 额尔古纳市| 大埔区| 西充县| 万山特区| 田东县| 修武县| 休宁县| 尼勒克县| 庆城县| 黄梅县| 襄汾县|