java.lang.NullPointerException -如何處理空指針異常?

2021-12-23 GitHub今日熱榜

點擊藍字「程式設計師考拉」歡迎關注!

當應用程式試圖null在需要對象的情況下使用時拋出。這些包括:

調用null對象的實例方法。

訪問或修改null對象的欄位。

把長度null當作一個數組。

像訪問或修改null陣列一樣訪問或修改插槽。

投擲null就好像它是一個Throwable 價值。

應用程式應該拋出此類的實例來指示null對象的其他非法使用。 

NullPointerException對象可以由虛擬機構造,就像抑制被禁用和/或堆棧跟蹤不可寫一樣。

為什麼我們需要空值?

如前所述,nullJava是一種特殊的值。它在編碼某些設計模式(如空對象模式和單例模式)時非常有用。空對象模式提供了一個對象作為缺少給定類型對象的代理。Singleton模式確保只創建一個類的一個實例,並且旨在提供對象的全局訪問點。

例如,最多創建一個類實例的示例方法是將其所有構造函數聲明為private,然後創建一個返回該類的唯一實例的公共方法:


TestSingleton.java

import java.util.UUID;

class Singleton {

    private static Singleton single = null;
    private String ID = null;

    private Singleton() {
         

         ID = UUID.randomUUID().toString();
    }

    public static Singleton getInstance() {
         if (single == null)
              single = new Singleton();

         return single;
    }

    public String getID() {
         return this.ID;
    }
}

public class TestSingleton {
    public static void main(String[] args) {
         Singleton s = Singleton.getInstance();
         System.out.println(s.getID());
    }
}


在這個例子中,我們聲明了一個Singleton類的靜態實例。該實例在該getInstance方法內最多初始化一次。注意使用null啟用唯一實例創建的值。


如何避免NullPointerException?

為了避免這種情況NullPointerException,請確保在使用它們之前,所有對象都已正確初始化。注意,當你聲明一個引用變量時,你真的創建了一個指向對象的指針。在向對象請求方法或欄位之前,您必須驗證指針是否為空。

另外,如果引發異常,請使用駐留在異常堆棧跟蹤中的信息。執行的堆棧跟蹤由JVM提供,以啟用應用程式的調試。找到捕獲異常的方法和行,然後確定哪個引用等於在特定行中為null。

在本節的其餘部分中,我們將介紹一些處理上述例外的技術。但是,它們並沒有消除這個問題,程式設計師在編寫應用程式時應該小心。

1.字符串與文字的比較
應用程式執行代碼中的一個非常常見的情況涉及字符串變量和文字之間的比較。文字可以是一個字符串或Enum的元素。不要從空對象調用方法,而應考慮從文字中調用它。例如,觀察以下情況:

String str = null;
if(str.equals(「Test」)){
    / *這裡的代碼將不會被觸發,因為會拋出異常。* /
}

上面的代碼片段會拋出一個NullPointerException。但是,如果我們從文字中調用方法,那麼執行流程通常會繼續:

String str = null;
if(「Test」.equals(str)){
    / *正確的用例。不會拋出異常。* /
}

2.檢查方法的參數
在執行你自己的方法的主體之前,一定要檢查它的參數為空值。只有在正確檢查了參數後,才繼續執行該方法。否則,您可以拋出一個IllegalArgumentException並通知調用方法傳遞的參數有問題。例如:

public static int getLength(String s){
    如果(s == null)
         拋出新的IllegalArgumentException(「參數不能為空」);

    return s.length();
}

3.優先使用String.valueOf()方法代替toString()
當您的應用程式代碼需要對象的字符串表示形式時,請避免使用該對象的toString方法。如果你的對象的引用等於null,NullPointerException則會拋出a。

相反,考慮使用靜態String.valueOf方法,該方法不會拋出任何異常並列印」null」,以防函數的參數等於null。

4.使用三元運算符
該ternary操作是非常有用的,可以幫助我們避免了NullPointerException。形式是:

首先,評估布爾表達式。如果表達式為true,則返回value1,否則返回value2。我們可以使用ternary運算符來處理空指針,如下所示:

String message =(str == null)?"":str.substring(0,10);

如果str引用為空,則消息變量將為空。否則,如果str指向實際數據,則消息將檢索它的前10個字符。

5.創建返回空集合而不是null的方法
一個非常好的技術是創建返回一個空集合的方法,而不是一個null值。你的應用程式的代碼可以遍歷空集合併使用它的方法和欄位,而不會拋出一個NullPointerException。例如:

Example.java

public class Example {
    private static List<Integer> numbers = null;

    public static List<Integer> getList() {
         if (numbers == null)
              return Collections.emptyList();
         else
              return numbers;
    }
}

6.使用Apache的StringUtils類
Apache的Commons Lang是一個為java.langAPI 提供幫助工具的庫,比如字符串操作方法。提供字符串操作的示例類是StringUtils.java,它null靜靜地處理輸入字符串。

你可以使用StringUtils.isNotEmpty, StringUtils.IsEmpty和StringUtils.equals方法,以避免NullPointerException。例如:

if(StringUtils.isNotEmpty(str)){
    System.out.println(str.toString());
}

7.使用contains(),containsKey(),containsValue()方法
如果您的應用程式代碼使用集合,例如Maps考慮使用包含containsKey和containsValue方法。例如,在地圖中驗證其存在之後,檢索特定鍵的值:

Map <String,String> map = ...
...
String key = ...
String value = map.get(key);
的System.out.println(value.toString());

在上面的代碼片段中,我們不檢查密鑰是否真的存在於內部Map,因此返回的值可以是null。最安全的方法如下:

Map <String,String> map = ...
...
String key = ...
if(map.containsKey(key)){
    String value = map.get(key);
    的System.out.println(value.toString());
}

8.檢查外部方法的返回值
在實踐中使用外部庫是很常見的。這些庫包含返回引用的方法。確保返回的參考不是null。另外,請考慮閱讀該方法的Javadoc,以便更好地理解其功能和返回值。

9.使用斷言
斷言在測試代碼時非常有用,並且可以被使用,以避免執行代碼片斷,從而導致錯誤NullPointerException。Java斷言是用assert關鍵字實現的,並拋出一個AssertionError。

請注意,您必須顯式啟用JVM的斷言標誌,方法是使用–ea參數執行該標誌。否則,斷言將被完全忽略。使用Java斷言的示例示例如下:

public static int getLength(String s){
    / *確保String不為null。* /
    assert(s!= null);
    return s.length();
}

如果您執行上面的代碼段並傳遞一個空參數getLength,則會出現以下錯誤消息:

Exception in thread "main" java.lang.AssertionError

最後,您可以使用測試框架Assert提供的類jUnit。

10.單元測試
在測試代碼的功能和正確性時,單元測試可能非常有用。花一些時間編寫一些測試用例,驗證NullPointerException應用程式的代碼是否經歷了特定的執行流程,否則將引發no 。

現有的NullPointerException安全方法


1.訪問類的靜態成員或方法
當你的代碼試圖訪問靜態變量或類的方法時,即使對象的引用等於null,JVM也不會拋出一個NullPointerException。這是由於Java編譯器在編譯過程中將靜態方法和欄位存儲在特殊位置。因此,靜態欄位和方法不與對象相關聯,而與類的名稱相關聯。

例如,下面的代碼不會拋出NullPointerException:

TestStatic.java:

class SampleClass {

    public static void printMessage(){
         System.out.println(「Hello Java Geeks!」);
    }
}

public class TestStatic {
    public static void main(String [] args){
         SampleClass sc = null;
         sc.printMessage();
    }
}

注意,儘管SampleClass等於的實例null將會被正確執行。但是,對於靜態方法或欄位,最好以靜態方式訪問它們,比如SampleClass.printMessage()。

2.instanceof
instanceof即使對象的引用等於,也可以使用該運算符null。在instanceof操作時,參考值等於為null,不拋出一個返回false NullPointerException。例如,考慮下面的代碼片段:

String str = null;
if(str instanceof String)
    System.out.println("It's an instance of the String class!");
else
    System.out.println("Not an instance of the String class!");

正如預期的那樣,執行的結果是:

Not an instance of the String class!

出處:https://blog.csdn.net/qq_35376421/article/details/80239080

歡迎點讚分享到朋友圈!

相關焦點

  • java.lang.nullpointerexception 怎麼解決及出現原因?-CSDN
    相信做過java開發的都遇到過java.lang.nullpointerexception異常,即是空指針異常。解決方法:定位到報空指針異常的這一行代碼,找到有"." 即有點的地方,任何有"."點的地方,都有可能報空指針異常。
  • 讓人慾罷不能的空指針(NullPointerException)
    定義:NullPointerException是java.lang.NullPointerException的簡稱,是Java語言中的一個異常類,位於java.lang包中,父類是java.lang.RuntimeException,該異常在源程序中可以不進行捕獲和處理。發生頻率: ★★★★★發生原因:當應用程式試圖在需要對象的地方使用時,拋出該異常。
  • java NullPointerException異常處理
    java語言與其他程式語言不同,它有嚴格的異常處理機制,如果需要拋出異常的代碼塊中沒有捕獲異常,程序將不會成功編譯,換言之:未使用異常捕獲、異常捕獲方式不正確等,都將導致代碼不能被jvm編譯。(空指針異常)什麼時候出現NullPointerException?
  • NullPointerException空指針異常的處理技巧
    尊敬的讀者,記得加關注、點讚喲,您的認可是我最大的動力,謝謝空指針異常大家都知道,都很了解,直接先說一下哪些情況會出現空指針異常:調用null對象的方法上邊例子中的「int i = integer」,自動拆箱,實際上就是自動調用integer的intValue,null對象調用方法,出現NullPointerException(空指針異常),反過來「Integer integer = i」,自動裝箱,就是調用Integer的valueOf(int)方法。
  • Java 14 發布了,再也不怕 NullPointerException 了!
    在JDK 14中,共有16個新特性,本文主要來介紹其中的一個特性:JEP 358: Helpful NullPointerExceptionsnull何錯之有?對於Java程式設計師來說,null是令人頭痛的東西。時常會受到空指針異常(NullPointerException)的騷擾。
  • Java 14 發布了,再也不怕NullPointerException 了!?
    在JDK 14中,共有16個新特性,本文主要來介紹其中的一個特性:JEP 358: Helpful NullPointerExceptionsnull何錯之有?對於Java程式設計師來說,null是令人頭痛的東西。時常會受到空指針異常(NullPointerException)的騷擾。
  • java 這些地方容易遭遇 NullPointerException異常
    上一篇文章講到 java NullPointerException異常處理,這一篇來講一下具體有哪些地方容易遇到NullPointerExcetion(空指針)異常。磨刀不誤砍柴工,不太清楚空指針的朋友可以先讀一下上面那篇文章,會有所啟發。我們進入今日的主題,哪些代碼會碰到:NullpointerExcetion? 先看一段代碼。
  • Java14 處理 NullPointerException 新方式,真的太香了!
    > 在Java語言中,處理空指針往往是一件很頭疼的事情
  • 深入 Spring Boot:排查 @Transactional 引起的 NullPointerException
    :Caused by: java.lang.NullPointerException    at sample.mybatis.dao.StudentDao.finalSelectStudentById(StudentDao.java:27)    at com.example.demo.transactional.nullpointerexception.DemoNullPointerExceptionApplication.init
  • Java簡潔之道:別讓空值處理那麼「難堪」
    在編程中,最經常遇到的異常是空指針異常(java.lang.NullPointerException),根據某個業務場景,我們就會編寫如下的代碼,並使用if……else.判斷對象是否為空。傳統的空值處理邏輯可以明顯地看到,無休止的if判斷讓程序變得臃腫、冗長。這個問題怎麼解決呢,來看看Optional類是如何處理的,如下。
  • Java編程中常見的異常
    這個異常大家肯定都經常遇到,異常的解釋是"程序遇上了空指針",簡單地說就是調用了未經初始化的對象或者是不存在的對象,這個錯誤經常出現在創建圖片,調用數組這些操作中,比如圖片未經初始化,或者圖片創建時的路徑錯誤等等。對數組操作中出現空指針,很多情況下是一些剛開始學習編程的朋友常犯的錯誤,即把數組的初始化和數組元素的初始化混淆起來了。
  • Java異常的十大問題總結
    本文總結了有關Java異常的十大常見問題。1.已檢查與未檢查簡而言之,必須在方法中顯式捕獲已檢查的異常或在方法的throws子句中聲明該異常。未檢查的異常是由無法解決的問題引起的,例如被零除,空指針等。
  • Java認證:java運行時常見異常
    總結了幾個JAVA中常見的RuntimeException:  NullPointerException:空指針異常類  示例:  package com.darkmi.basic;  public class Test {  public static void
  • Java項目中常見的異常產生原因及處理辦法
    使用throw語句可以隨時拋出這種異常對象:throw new ArithmeticException(…);二、異常發生的原因有很多,通常包含以下幾大類:三、幾種常見的異常及其產生原因1、java.lang.NullPointerException(空指針異常)原因:這個異常大家肯定都經常遇到,異常的解釋是"程序遇上了空指針",即,調用了未經初始化的對象或者是不存在的對象
  • 如何優雅的設計 Java 異常
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫導語異常處理是程序開發中必不可少操作之一,但如何正確優雅的對異常進行處理確是一門學問
  • JAVA異常及其異常處理方式
    比如說,你的代碼少了一個分號,那麼運行出來結果是提示是錯誤 java.lang.Error;如果你用System.out.println(100/0),那麼你是因為你用0做了除數,會拋出 java.lang.ArithmeticException 的異常。
  • 有效處理 Java 異常三原則
    java.lang.NullPointerExceptionat java.io.FileInputStream.open(Native Method)at java.io.FileInputStream.
  • Java:如何更優雅地處理空值?
    有時候,更可怕的是系統因為這些空值的情況,會拋出空指針異常,導致業務系統發生問題。此篇文章,我總結了幾種關於空值的處理手法,希望對讀者有幫助。對於以上的接口,當我們使用TDD進行測試用例先行時,發現了潛在的問題:listUser() 如果沒有數據,那它是返回空集合還是null呢?get(Integer id) 如果沒有這個對象,是拋異常還是返回null呢?
  • Java應用架構中該如何設計異常?
    如何選擇異常類型異常的類別正如我們所知道的,java中的異常的超類是java.lang.Throwable(後文省略為Throwable),它有兩個比較重要的子類
  • 兩萬字詳解Java異常,面試再也不怕被問到!
    比如NullPointerException空指針異常、ArrayIndexOutBoundException數組下標越界異常、ClassCastException類型轉換異常、ArithmeticExecption算術異常。此類異常屬於不受檢異常,一般是由程序邏輯錯誤引起的,在程序中可以選擇捕獲處理,也可以不處理。