精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 10:25 ? 次閱讀

在編寫 Java 程序的過程中,有一種異常幾乎每個開發者都會遇到——空指針異常(NullPointerException)。這個問題可能會讓一些新手菜鳥感到困擾,甚至一些經驗豐富的開發者也會不時地遇到這個問題。

那么我們應該如何有效且優雅的處理空指針異常呢? 下面了不起將詳細的介紹這個處理方案。

1、什么是空指針異常?

空指針異常在 Java 中是一個運行時錯誤,它發生在當我們試圖訪問一個 null 引用的成員時,例如調用一個 null 對象的方法或訪問其字段。這種情況下,JVM 會拋出 NullPointerException。例如:

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

在這個例子中,我們試圖調用 strlength() 方法,但是 strnull,所以 JVM 拋出了 NullPointerException

2、為什么會出現空指針異常?

在 Java 中,對象是通過引用來訪問的。當我們聲明一個對象變量時,只是創建了一個引用,并沒有創建實際的對象。在使用對象之前,需要通過 new 關鍵字來創建實際的對象,將其賦給引用。但是,如果我們沒有創建實際的對象,或者已經將對象置為 null,那么再試圖使用這個引用,就會導致空指針異常。這是因為這個引用沒有指向任何實際的對象,我們不能通過它來訪問任何成員。

例如,下面的代碼會導致空指針異常,因為我們試圖訪問 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、如何預防空指針異常?

在我們開始處理空指針異常之前,我們需要首先學會如何預防它。以下是一些預防空指針異常的常見策略:

  • 使用 Objects.requireNonNull() 確認對象不為 null

Java 7 引入了一個很有用的工具類 Objects,它提供了一個 requireNonNull() 方法,這個方法可以用來檢查一個對象是否為 null。如果對象是 null,它會拋出 NullPointerException。這可以幫助我們在早期發現和處理空指針問題。

例如:

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
    }
}
  • 在方法中對參數進行非 null 校驗

當我們編寫一個方法并期望其參數不為 null 時,應當在方法開始處對參數進行非 null 校驗。如果參數為 null,應當立即拋出 NullPointerExceptionIllegalArgumentException。這樣可以盡早地發現問題,并避免錯誤的進一步傳播。

例如:

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

    // ...
}
  • 使用 Optional 類來更優雅地處理可能為 null 的情況

Java 8 引入了一個新的類 Optional,它是一個可以包含也可以不包含值的容器對象。Optional 提供了一種更優雅、更安全的方式來處理可能為 null 的情況,而無需顯式地進行 null 檢查。我們會在后面的部分詳細討論 Optional 的使用。

除了上述技術之外,也有一些通用的編程最佳實踐可以幫助我們避免空指針異常。例如,我們應當盡量減少 null 的使用,盡量不要返回 null,可以考慮使用空對象或默認對象。在對輸入參數進行處理時,我們應當總是假設輸入可能為 null 并進行相應的處理。

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

雖然我們已經知道了如何預防空指針異常,但是在某些情況下,我們可能還是需要捕獲和處理這個異常。Java 提供了 try/catch 語句來捕獲和處理異常,包括空指針異常。

下面是一個例子:

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

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

雖然 try/catch 是一個強大的工具,但是我們應當謹慎使用它。不應該用 try/catch 來替代良好的編程實踐和合理的 null 檢查。過度使用 try/catch 可能會使代碼變得混亂,難以閱讀和維護,也可能會隱藏真正的問題。

5、Java 8 Optional 類的使用

如前所述,Java 8 引入了 Optional 類來幫助開發者更優雅地處理可能為 null 的情況。Optional是一個可以包含也可以不包含值的容器對象。當我們期望一個方法可能返回 null 時,可以考慮讓它返回 Optional 對象,這樣調用者就可以更方便地檢查返回值是否為 null

下面是一個例子:

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();  // 返回一個不包含值的 Optional
    }
}

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

6、編程最佳實踐

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

  • 對輸入參數進行校驗
    在處理方法參數之前,總是檢查其是否為 null。如果方法不接受 null 參數,應該立即返回或拋出異常。
  • 盡量避免返回 null
    如果方法可能返回 null,考慮返回 Optional 類型,或者返回一個空對象或默認對象。這樣可以避免調用者直接處理 null
  • 鼓勵使用空對象或默認對象,而非 null
    空對象(也稱為 Null 對象)或默認對象是一種設計模式,可以在沒有數據的情況下提供默認的行為。使用空對象或默認對象可以簡化代碼,避免需要檢查 null
  • 盡可能減少 null 的使用
    盡管 null 在 Java 中是不可避免的,但是我們應當盡量減少 null 的使用。過度使用 null 會導致代碼難以理解和維護,并增加出錯的可能性。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2960

    瀏覽量

    104562
  • 編程
    +關注

    關注

    88

    文章

    3596

    瀏覽量

    93610
  • 容器
    +關注

    關注

    0

    文章

    494

    瀏覽量

    22046
  • 指針
    +關注

    關注

    1

    文章

    480

    瀏覽量

    70512
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
收藏 人收藏

    評論

    相關推薦

    指針指針的兩個小點

    大家都知道指針的學習對于c語言學習來說可謂是至關重要的,下面我們來說一下在指針中兩種比較特殊的關于指針的概念,野指針
    發表于 10-14 15:56

    函數指針的問題

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

    【設計技巧】指針的使用注意事項:指針指針賦值、void *指針

    *)型。所以說,void類型指針是 傳遞參數的利器。 void型指針只能用于指針的傳送,不能直接使用,我們傳遞完void類型指針后,當我們要具體使用它的時候,必須必須必須將該
    發表于 08-20 08:30

    Java異常體系級處理辦法

    ;  CheckException:已檢查異常,編譯階段必須處理;  幾個經典的常見的RunTimeException如下:指針NullPointerException;數組下標越界
    發表于 01-05 17:48

    單片機的異常處理

    的返回地址,錯誤是否發生在異常處理中,以及EXC_RETURN的值是否被異常破壞等。另外,當前的寄存器值也可以提供有助于定位錯誤原因的各種信息,除了當前棧指針的值,當前的鏈接寄存器的值
    發表于 10-29 13:36

    DevEco Studio打開歷史工程報指針錯誤怎么解決?

    DevEco Studio打開歷史工程報指針錯誤
    發表于 04-12 11:48

    DevEco Studio打開歷史工程報指針錯誤是為什么?

    DevEcoStudio打開歷史工程報指針錯誤
    發表于 06-10 10:21

    為什么程序中會出現指針?

    為什么程序中會出現指針
    發表于 10-10 07:25

    java異常處理的設計與重構

    在程序設計中,進行異常處理是非常關鍵和重要的一部分。一個程序的異常處理框架的好壞直接影響到整個項目的代碼質量以及后期維護成本和難度。試想一下,如果一個項目從頭到尾沒有考慮過
    發表于 09-27 15:40 ?1次下載
    java<b class='flag-5'>異常</b><b class='flag-5'>處理</b>的設計與重構

    指針引用缺陷分類假陽性識別方法

    針對靜態測試中空指針引用缺陷假陽性問題,提出一種指針引用缺陷分類假陽性識別方法。挖掘指針引用缺陷知識,對空
    發表于 11-25 11:04 ?8次下載
    <b class='flag-5'>空</b><b class='flag-5'>指針</b>引用缺陷分類假陽性識別方法

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

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

    你們知道指針和引用正確的使用場景嗎

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

    指針和引用的區別及使用場景介紹

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

    懸空指針能不能訪問?

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

    bigdecimal轉string類型避免指針

    指針異常的發生。本文將詳細介紹如何將BigDecimal對象轉換為String類型,以及如何避免指針
    的頭像 發表于 11-30 11:12 ?2573次閱讀