欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)

 更新時(shí)間:2019年12月02日 10:40:29   作者:幻云愛你  
這篇文章主要介紹了java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

當(dāng)應(yīng)用程序試圖null在需要對(duì)象的情況下使用時(shí)拋出。這些包括:

  • 調(diào)用null對(duì)象的實(shí)例方法。
  • 訪問或修改null對(duì)象的字段。
  • 把長度null當(dāng)作一個(gè)數(shù)組。
  • 像訪問或修改null陣列一樣訪問或修改插槽。
  • 投擲null就好像它是一個(gè)Throwable 價(jià)值。
  • 應(yīng)用程序應(yīng)該拋出此類的實(shí)例來指示null對(duì)象的其他非法使用。
  • NullPointerException對(duì)象可以由虛擬機(jī)構(gòu)造,就像抑制被禁用和/或堆棧跟蹤不可寫一樣。

為什么我們需要空值?

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

例如,最多創(chuàng)建一個(gè)類實(shí)例的示例方法是將其所有構(gòu)造函數(shù)聲明為private,然后創(chuàng)建一個(gè)返回該類的唯一實(shí)例的公共方法:

TestSingleton.java:

import java.util.UUID;

class Singleton {

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

   private Singleton() {
     /* Make it private, in order to prevent the creation of new instances of
      * the Singleton class. */

     ID = UUID.randomUUID().toString(); // Create a random ID.
   }

   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());
   }
}

在這個(gè)例子中,我們聲明了一個(gè)Singleton類的靜態(tài)實(shí)例。該實(shí)例在該getInstance方法內(nèi)最多初始化一次。注意使用null啟用唯一實(shí)例創(chuàng)建的值。

如何避免NullPointerException

為了避免這種情況NullPointerException,請(qǐng)確保在使用它們之前,所有對(duì)象都已正確初始化。注意,當(dāng)你聲明一個(gè)引用變量時(shí),你真的創(chuàng)建了一個(gè)指向?qū)ο蟮闹羔槨T谙驅(qū)ο笳?qǐng)求方法或字段之前,您必須驗(yàn)證指針是否為空。

另外,如果引發(fā)異常,請(qǐng)使用駐留在異常堆棧跟蹤中的信息。執(zhí)行的堆棧跟蹤由JVM提供,以啟用應(yīng)用程序的調(diào)試。找到捕獲異常的方法和行,然后確定哪個(gè)引用等于在特定行中為null。

在本節(jié)的其余部分中,我們將介紹一些處理上述例外的技術(shù)。但是,它們并沒有消除這個(gè)問題,程序員在編寫應(yīng)用程序時(shí)應(yīng)該小心。

1.字符串與文字的比較

應(yīng)用程序執(zhí)行代碼中的一個(gè)非常常見的情況涉及字符串變量和文字之間的比較。文字可以是一個(gè)字符串或Enum的元素。不要從空對(duì)象調(diào)用方法,而應(yīng)考慮從文字中調(diào)用它。例如,觀察以下情況:

String str = null;
if(str.equals(“Test”)){
   / *這里的代碼將不會(huì)被觸發(fā),因?yàn)闀?huì)拋出異常。* /
}

上面的代碼片段會(huì)拋出一個(gè)NullPointerException。但是,如果我們從文字中調(diào)用方法,那么執(zhí)行流程通常會(huì)繼續(xù):

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

2.檢查方法的參數(shù)

在執(zhí)行你自己的方法的主體之前,一定要檢查它的參數(shù)為空值。只有在正確檢查了參數(shù)后,才繼續(xù)執(zhí)行該方法。否則,您可以拋出一個(gè)IllegalArgumentException并通知調(diào)用方法傳遞的參數(shù)有問題。

例如:

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

   return s.length();
}

3.優(yōu)先使用String.valueOf()方法代替toString()

當(dāng)您的應(yīng)用程序代碼需要對(duì)象的字符串表示形式時(shí),請(qǐng)避免使用該對(duì)象的toString方法。如果你的對(duì)象的引用等于null,NullPointerException則會(huì)拋出a。

相反,考慮使用靜態(tài)String.valueOf方法,該方法不會(huì)拋出任何異常并打印"null",以防函數(shù)的參數(shù)等于null。

4.使用三元運(yùn)算符

該ternary操作是非常有用的,可以幫助我們避免了NullPointerException。運(yùn)營商的形式是:

布爾表達(dá)式?value1:value2;

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

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

如果str引用為空,則消息變量將為空。否則,如果str指向?qū)嶋H數(shù)據(jù),則消息將檢索它的前10個(gè)字符。

5.創(chuàng)建返回空集合而不是null的方法

一個(gè)非常好的技術(shù)是創(chuàng)建返回一個(gè)空集合的方法,而不是一個(gè)null值。你的應(yīng)用程序的代碼可以遍歷空集合并使用它的方法和字段,而不會(huì)拋出一個(gè)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是一個(gè)為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()方法

如果您的應(yīng)用程序代碼使用集合,例如Maps考慮使用包含containsKey和containsValue方法。例如,在地圖中驗(yàn)證其存在之后,檢索特定鍵的值:

Map <String,String> map = ... 
... 
String key = ... 
String value = map.get(key); 
的System.out.println(value.toString()); //如果值為null,則會(huì)拋出異常。

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

Map <String,String> map = ... 
... 
String key = ... 
if(map.containsKey(key)){ 
   String value = map.get(key); 
   的System.out.println(value.toString()); //不會(huì)拋出異常。
}

8.檢查外部方法的返回值

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

9.使用斷言

斷言在測(cè)試代碼時(shí)非常有用,并且可以被使用,以避免執(zhí)行代碼片斷,從而導(dǎo)致錯(cuò)誤NullPointerException。Java斷言是用assert關(guān)鍵字實(shí)現(xiàn)的,并拋出一個(gè)AssertionError。

請(qǐng)注意,您必須顯式啟用JVM的斷言標(biāo)志,方法是使用–ea參數(shù)執(zhí)行該標(biāo)志。否則,斷言將被完全忽略。

使用Java斷言的示例示例如下:

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

   return s.length(); 
}

如果您執(zhí)行上面的代碼段并傳遞一個(gè)空參數(shù)getLength,則會(huì)出現(xiàn)以下錯(cuò)誤消息:

Exception in thread "main" java.lang.AssertionError

最后,您可以使用測(cè)試框架Assert提供的類jUnit。

10.單元測(cè)試

在測(cè)試代​​碼的功能和正確性時(shí),單元測(cè)試可能非常有用?;ㄒ恍r(shí)間編寫一些測(cè)試用例,驗(yàn)證NullPointerException應(yīng)用程序的代碼是否經(jīng)歷了特定的執(zhí)行流程,否則將引發(fā)no 。

現(xiàn)有的NullPointerException安全方法

1.訪問類的靜態(tài)成員或方法

當(dāng)你的代碼試圖訪問靜態(tài)變量或類的方法時(shí),即使對(duì)象的引用等于null,JVM也不會(huì)拋出一個(gè)NullPointerException。這是由于Java編譯器在編譯過程中將靜態(tài)方法和字段存儲(chǔ)在特殊位置。因此,靜態(tài)字段和方法不與對(duì)象相關(guān)聯(lián),而與類的名稱相關(guān)聯(lián)。

例如,下面的代碼不會(huì)拋出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等于的實(shí)例null將會(huì)被正確執(zhí)行。但是,對(duì)于靜態(tài)方法或字段,最好以靜態(tài)方式訪問它們,比如SampleClass.printMessage()。

2.運(yùn)營商的instanceof

instanceof即使對(duì)象的引用等于,也可以使用該運(yùn)算符null。在instanceof操作時(shí),參考值等于為null,不拋出一個(gè)返回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!");

正如預(yù)期的那樣,執(zhí)行的結(jié)果是:

Not an instance of the String class!

這是一篇關(guān)于如何處理Java的教程N(yùn)ullPointerException。

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot集成Memcached的項(xiàng)目實(shí)踐

    SpringBoot集成Memcached的項(xiàng)目實(shí)踐

    Memcached是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫負(fù)載,本文主要介紹了SpringBoot集成Memcached的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java項(xiàng)目安全處理方法

    Java項(xiàng)目安全處理方法

    這篇文章主要介紹了Java項(xiàng)目安全處理方法,URL中參數(shù)顯示,sql拼接問題,需要的朋友可以參考下
    2017-09-09
  • SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作

    SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作

    這篇文章主要介紹了SpringBoot與Postman實(shí)現(xiàn)REST模擬請(qǐng)求的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else

    Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else

    策略模式定義了一系列算法,并且將每個(gè)算法封裝起來,使得他們可以相互替換,而且算法的變化不會(huì)影響使用算法的客戶端。本文將通過案例講解如何利用Java的策略模式實(shí)現(xiàn)條件判斷,告別if----else條件硬編碼,需要的可以參考一下
    2022-02-02
  • Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)

    Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié)

    這篇文章主要介紹了Mybatis中#{}和${}傳參的區(qū)別及#和$的區(qū)別小結(jié) 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • SpringBoot使用Spark過程詳解

    SpringBoot使用Spark過程詳解

    這篇文章主要介紹SpringBoot使用Spark的方法的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望能幫助大家解決問題
    2023-02-02
  • Java中String類startsWith方法詳解

    Java中String類startsWith方法詳解

    這篇文章主要給大家介紹了關(guān)于Java中String類startsWith方法的相關(guān)資料,startsWith() 方法用于檢測(cè)字符串是否以指定的前綴開始,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Java之Set?交集,差集,并集的用法

    Java之Set?交集,差集,并集的用法

    這篇文章主要介紹了Java之Set?交集,差集,并集的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java后端用EL表達(dá)式改進(jìn)JSP

    Java后端用EL表達(dá)式改進(jìn)JSP

    EL 全名為Expression Language,EL的語法很簡(jiǎn)單,它最大的特點(diǎn)就是使用上很方便,本文帶你用EL表達(dá)式改進(jìn)JSP,感興趣的朋友來看看吧
    2022-02-02
  • Java雙重MD5加密實(shí)現(xiàn)安全登錄

    Java雙重MD5加密實(shí)現(xiàn)安全登錄

    MD5對(duì)密碼進(jìn)行加密存儲(chǔ)是常見的一種加密方式,本文主要介紹了Java雙重MD5加密實(shí)現(xiàn)安全登錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07

最新評(píng)論