91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中空指針異常情況的示例分析

發布時間:2021-10-08 09:57:37 來源:億速云 閱讀:241 作者:小新 欄目:開發技術

小編給大家分享一下java中空指針異常情況的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概述

出現空指針異常,常常是因為我們調用的對象是空的而拋出的異常。

問題描述

第一種

out.println(request.getParameter("username"));

如果request里面并沒有username的值,這時無法對空對象進行操作的,就會拋出異常。

第二種

String userName = request.getParameter("username"); 
  If (userName.equals("root")) 
  {....}

如果沒有username值,或者username為null時,是不能將一個為null的對象與另外一個對象進行比較的。

If ("root".equals(user Name)) 
  {....}

如果返回值與常量進行比較時,就可以避免調用null對象的equals方法。不會拋出異常。

第三種

假設有一個student類,有屬性name。

Student a;
String b = a.name;

這個時候就會報錯,因為a為空的,解決辦法就是讓a指向一個對象,Student a = new Student();

問題定位

對于日志中的報錯信息,在java中拋出異常是從內往外,因此只需要重點關注第一行報錯信息,下面的報錯都是由于一層層傳遞調用該方法導致。

Java空指針異常的若干解決方案

Java中任何對象都可以為空,我們可以使用若干種方法來避免產生這類異常。比如我們傳統的空值檢測,編程規范,以及使用java中各種工具類。

(1)最常用的一種就是直接對 對象進行判斷

比如if(Object == null)來對所有用到的對象進行判斷,這個對象也就是我們常用的函數參數,返回值,以及類實例的成員變量等。當我們檢測到null值時,我們可以異常的類型拋出更具有針對性的異常類型,再附加上我們自己加的消息內容。我們也可以直接使用一些庫函數來簡化代碼:

Object checkData = Object.requireNoNull(resultMessage,"The resultMessage must not be null")

如果我們使用過Lombok工具的話,里面有一個@NotNull注解,就是指被注釋的元素不能為空,就會自定檢測。

(2)第二種方法就是遵守編程規范,可以減少一定的空指針異常的發生。

Strings.isNullOrEmpty(str);
CollectionUtils.isEmpty(collection);
StringUtils.isEmpty(str);

if(object != null) {
    object.toString();)
} // 使用toString()這種方法的話,如果object為空的話,就會拋出異常
 String.valueOf(object) //將Object轉換為字符串,不管是否為null,不會拋出異常

如果返回是集合類型。而且是空的,不要返回null值,而是要返回一個空的集合,如果返回類型是對象的話,我們可以拋出異常。

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

檢查一個方法的參數,在執行方法之前,確保檢查了參數是否null,當參數被適當檢查后,方法會繼續執行。否則拋出叫做llegalArgumentException的異常,并通知調用的方法傳入的參數有誤。

使用三元運算符,可以避免NullPointerException,形式如下:

boolean expression ? value1:value2;

存在NullPointerException的安全方法

第一種使用instanceof 操作符

即使對象的引用為null,instanceOf操作符可使用。當引用為null時,instanceof操作符返回false,而且不會拋出NullPointerException,比如:

String str = null;
if(str instanceof null) {
    log.error(.......)
}

如何避免

確保所有對象在使用之前被初始化。

java空指針異常:java.lang.NullPointException

一.什么是java空指針異常

我們都知道java是沒有指針的,這里說的"java指針"指的就是java的引用,我們不在這里討論叫指針究竟合不合適,而只是針對這個異常本身進行分析。

空指針就是空引用,java空指針異常就是引用本身為空,卻調用了方法,這個時候就會出現空指針異常。

可以理解,成員變量和方法是屬于對象的(除去靜態),在對象中才存在相對應的成員變量和方法,然后通過對象去調用這些成員變量和方法。

對于空指針來說,它不指向任何對象,也就沒有所謂的成員變量和方法,這個時候用它去調用某些屬性和方法,當然會出現空指針異常。

public class Test {
    private int a=1;
    private int b=2;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Test t1 = new Test();
        Test t2 = null;
        System.out.println(t1.a);
        System.out.println(t2.a);
        System.out.println(t2.c());
    }
    public String c(){
        return "123";
    }
}

我們分析上面這段示例代碼,在Test類中,有兩個成員變量a和b,和一個方法c()。

然后在main()方法中,我們創建了兩個對象t1和t2,其中t1指向通過構造方法實例出的Test對象,而t2只是聲明,并指向了空,并沒有指向實際的對象。

調試的時候,第一條輸出語句是可以通過編譯的,而執行到第二條輸出語句的時候,由于空指針調用了不屬于它的a,程序終止,報告空指針異常。

同樣,注釋第二條輸出語句,程序在執行到第三條輸出語句的時候,由于調用了不屬于它的c()方法,會出現一樣的錯誤。

二.如何解決

對于每一個java程序員來說,幾乎都避免不了遇到空指針異常,特別是經驗不足的初學者。而且由于它的調試和查找相對其它異常來說比較困難,常常需要花費很大的精力去解決它。

首先認識一下java中的null

null是Java中一個很重要的概念。null設計初衷是為了表示一些缺失的東西,例如缺失的用戶、資源或其他東西。但是,一年后,令人頭疼的空指針異常給Java程序員帶來不少的騷擾。

null是java中的關鍵字,因此,它不能寫成NULL,Null,只能是null。

null是所有引用類型的默認值,如果沒有讓一個引用指向一個實際存在的對象,它的默認值就是null。null本質上是一個值,這跟int的默認值是0,boolean的默認值是false一樣。現在,我們通常都使用像eclipse等的集成開發環境進行開發,一般在定義變量的時候都會進行初始化(這也是寫代碼的一個良好的習慣),如果沒有進行初始化,系統會進行提示。

報空指針異常的原因有以下幾種:

  • 1字符串變量未初始化;

  • 2接口類型的對象沒有用具體的類初始化,比如:

    • List it;會報錯

    • List it = new ArrayList();則不會報錯了

  • 3當一個對象的值為空時,你沒有判斷為空的情況。你可以試著把下面的代碼前加一行代碼:

    • if(rb!=null && rb!="")

    • 改成:

    • if(rb==null);

    • if(rb!==null&&rb!="") 或者if("").equals(rb))

空指針的解決辦法:

重點關注報錯發生的所在行,通過空指針異常產生的兩條主要原因診斷具體的錯誤。同時為了避免空指針的發生,最好在做判斷處理時將“null”或者空值放于 設定的值之前。

常見空指針異常的簡要分析:

(1)空指針錯誤

Java中的8種基本數據類型,變量的值可以有其默認值,加入沒有對其正常賦值,java虛擬機是不能 正確編譯通過的,因此使用基本的Java數據類型一般是不會引起空指針異常的。實際開發中,大多數的空指針異常主要與對象的操作相關。

下面列出可能發生空指針異常的幾種情況及相應解決方案:

代碼段1:

out.println(request.getParameter("username"));

分析:代碼段1的功能十分簡單,就是輸出用戶輸入"username"的值。

說明:看上去,上面的語句找不出什么語法錯誤,而且在大多數情況下也遇不到什么問題。但是,如果某個用戶在輸入數據時并沒有提供表單 域"username" 的值,或通過某種途徑繞過表單直接輸入時,此request.getParameter("username")的值為空(注意不是空字符串,是空對象 null。),out對象的println方法是無法直接對空對象操作的,因此代碼段1所在的JSP頁面將會拋出 "Java.lang.NullPointerException"異常。而且即使對象可能為空時,也調用Java.lang.Object或 Object對象本身的一些方法如toString(), equal(Object obj)等操作。

代碼段2:

String userName = request.getParameter("username"); 
If (userName.equals("root")) 
{....}

分析:代碼段2的功能是檢測用戶提供的用戶名,如果是用戶名稱為"root"的用戶時,就執行一些特別的操作。

說明:在代碼段2中,如果有用戶沒有提供表單域"username"的值時,字符串對象userName為null值,不能夠將一個null的對象與另一 個對象直接比較,同樣,代碼段2所在的JSP頁面就會拋空指針錯誤。

一個小技巧:如果要把某個方法的返回值與常量做比較,把常量放在前面,可以避免調用null對象的equals方法。譬如:

If ("root".equals(userName)) 
  {....}

即使userName對象返回了null對象,這里也不會有空指針異常,可以照常運轉。

代碼段3:

String userName = session.getAttribute("session.username").toString();

分析:代碼段3的功能是將session中session.username的值取出,并將該值賦給字符串對象userName。

說明:在一般情況下,如果在用戶已經進行某個會話,則不會出現什么問題;但是,如果此時應用服務器重新啟動,而用戶還沒有重新登錄,(也可能是用戶關閉瀏 覽器,但是仍打開原來的頁面。)那么,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個 為 null的對象的直接執行toString()操作,就會導致系統拋出空指針異常。

代碼段4:

public static void main(String args[]){
       Person p=null;
       p.setName("張三");
       System.out.println(p.getName());
}

分析:聲明一個Person對象,并打印出該對象的中的Name名字。

說明:這個時候你的p就出現空指針異常,因為你只是聲明了這個Person類型的對象并沒有創建對象,所以它的堆里面沒有地址引用,切忌你要用對 象掉用方法的時候一定要創建對象。

以上是“java中空指針異常情況的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北海市| 乌鲁木齐县| 金塔县| 响水县| 汕尾市| 壶关县| 河曲县| 洞口县| 嘉兴市| 武邑县| 石泉县| 梓潼县| 万安县| 延川县| 正阳县| 甘谷县| 逊克县| 昌吉市| 崇仁县| 渭源县| 邹城市| 乌鲁木齐市| 庄河市| 信宜市| 乐至县| 吴堡县| 图木舒克市| 克东县| 临漳县| 响水县| 苏尼特右旗| 含山县| 栖霞市| 杭锦旗| 区。| 若尔盖县| 拉萨市| 白银市| 营山县| 宁德市| 荥经县|