導航:首頁 > 編程語言 > java空指針處理

java空指針處理

發布時間:2024-07-05 22:52:38

java中的空指針異常怎麼解決

原文:https://www.hu.com/question

你這個問題的解決

問題定位:

在堆棧異常信息的第一行就可以定位到是哪裡出了空指針,倘若這里不是你寫的類,可以往下翻一下,找到你寫的類,就是這里出現的空指針。

問題解決:

對一個空對象調用裡面的方法或者屬性的時候會報空指針,檢查這個對象為什麼是空即可。

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

Java 中任何對象都有可能為空,當我們調用空對象的方法時就會拋出 NullPointerException 空指針異常,這是一種非常常見的錯誤類型。我們可以使用若干種方法來避免產生這類異常,使得我們的代碼更為健壯。本文將列舉這些解決方案,包括傳統的空值檢測、編程規范、以及使用現代 Java 語言引入的各類工具來作為輔助。

運行時檢測

最顯而易見的方法就是使用 if (obj == null) 來對所有需要用到的對象來進行檢測,包括函數參數、返回值、以及類實例的成員變數。當你檢測到 null 值時,可以選擇拋出更具針對性的異常類型,如 IllegalArgumentException,並添加消息內容。我們可以使用一些庫函數來簡化代碼,如 Java 7 開始提供的 Objects#requireNonNull 方法:

public void testObjects(Object arg) {
Object checked = Objects.requireNonNull(arg, "arg must not be null");
checked.toString();}

Guava 的 Preconditions 類中也提供了一系列用於檢測參數合法性的工具函數,其中就包含空值檢測:

public void testGuava(Object arg) {
Object checked = Preconditions.checkNotNull(arg, "%s must not be null", "arg");
checked.toString();
}

我們還可以使用 Lombok 來生成空值檢測代碼,並拋出帶有提示信息的空指針異常:

public void testLombok(@NonNull Object arg) {
arg.toString();

生成的代碼如下:

public void testLombokGenerated(Object arg) {
if (arg == null) {
throw new NullPointerException("arg is marked @NonNull but is null");
}
arg.toString();
}

這個註解還可以用在類實例的成員變數上,所有的賦值操作會自動進行空值檢測。

編程規范

·通過遵守某些編程規范,也可以從一定程度上減少空指針異常的發生。

使用那些已經對 null 值做過判斷的方法,如 String#equals、String#valueOf、以及三方庫中用來判斷字元串和集合是否為空的函數:

if (str != null && str.equals("text")) {}
if ("text".equals(str)) {}

if (obj != null) { obj.toString(); }
String.valueOf(obj); // "null"

// from spring-core
StringUtils.isEmpty(str);
CollectionUtils.isEmpty(col);
// from guava
Strings.isNullOrEmpty(str);
// from commons-collections4
CollectionUtils.isEmpty(col);

·如果函數的某個參數可以接收 null 值,考慮改寫成兩個函數,使用不同的函數簽名,這樣就可以強制要求每個參數都不為空了:

public void methodA(Object arg1) {
methodB(arg1, new Object[0]);
}

public void methodB(Object arg1, Object[] arg2) {
for (Object obj : arg2) {} // no null check
}

·如果函數的返回值是集合類型,當結果為空時,不要返回 null 值,而是返回一個空的集合;如果返回值類型是對象,則可以選擇拋出異常。Spring JdbcTemplate 正是使用了這種處理方式:

// 當查詢結果為空時,返回 new ArrayList<>()
jdbcTemplate.queryForList("SELECT * FROM person");

// 若找不到該條記錄,則拋出
jdbcTemplate.queryForObject("SELECT age FROM person WHERE id = 1", Integer.class);

// 支持泛型集合
public <T> List<T> testReturnCollection() {
return Collections.emptyList();
}

靜態代碼分析

Java 語言有許多靜態代碼分析工具,如 Eclipse IDE、SpotBugs、Checker Framework 等,它們可以幫助程序員檢測出編譯期的錯誤。結合 @Nullable 和 @Nonnull 等註解,我們就可以在程序運行之前發現可能拋出空指針異常的代碼。

但是,空值檢測註解還沒有得到標准化。雖然 2006 年 9 月社區提出了 JSR 305 規范,但它長期處於擱置狀態。很多第三方庫提供了類似的註解,且得到了不同工具的支持,其中使用較多的有:

⑵ 如何解決java的空指針異常

Throwable是所有錯誤或異常的超類,只有當對象是這個類的實例時才能通過Java虛擬機或者Java throw語句拋出。
當Java運行環境發出異常時,會尋找處理該異常的catch塊,找到對應的catch塊之後,將異常交給catch塊捕獲。
throwable的子類是exception和error,exception又分為IOException,NullPointerException等
空指針異常發生的原因:
調用方法的對象為null
根據控制台提示的位置,找到對應的異常位置。
例如:
List<String> books = Dao.getData();
int size = books.size();
第二行報空指針異常
那麼books對象為null,向上查找第一行中Dao.getData();
那麼進一步查看Dao對象是否為空,若不為空,則繼續向上查找,找出為null的對象
改進:
1.增加條件判斷
List<String> books = Dao.getData();
if(books!=null){
int size = books.size();
}
2.捕獲異常
List<String> books = Dao.getData();
try{
int size = books.size();
}catch(NullPointerException e){
e.printStackTrace();
System.out.printLn("size = 0");
}

⑶ java空指針引用!

空指針異常
空指針異常產生的主要原因如下:
(1) 當一個對象不存在時又調用其方法會產生異常
obj.method() // obj對象不存在
(2) 當訪問或修改一個對象不存在的欄位時會產生異常
obj.method() // method方法不存在

具體情況如下:
空指針錯誤( Java.lang.NullPointerException)
使用基本的Java數據類型,變數的值要麼已經是默認值,如果沒有對其正常賦值,程序便不能通過編譯,因此使用基本的Java數據類型(double,float,boolean,char,int,long)一般不會引起空指針異常。
由此可見,空指針異常主要跟與對象的操作相關。
下面先列出了可能發生空指針異常的幾種情況及相應解決方案:
情況一:不管對象是否為空就直接開始使用。
(JSP)代碼段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(), equals(Object obj)等操作。
(JSP)代碼段2:
String userName = request.getParameter("username");
If (userName.equals("root"))
{....}
描述:
代碼段2的功能是檢測用戶提供的用戶名,如果是用戶名稱為"root"的用戶時,就執行一些特別的操作。
說明:
在代碼段2中,如果有用戶沒有提供表單域"username"的值時,字元串對象userName為null值,不能夠將一個null的對象與另一個對象直接比較,同樣,代碼段2所在的JSP頁面就會拋出(Java.lang.NullPointerException)空指針錯誤。
(JSP)代碼段3:
String userName = session.getAttribute
("session.username").toString();
描述:
代碼段3的功能是將session中session.username的值取出,並將該值賦給字元串對象 userName。
說明:
在一般情況下,如果在用戶已經進行某個會話,則不會出現什麼問題;但是,如果此時應用伺服器重新啟動,而用戶還沒有重新登錄,(也可能是用戶關閉瀏覽器,但是仍打開原來的頁面。)那麼,此時該session的值就會失效,同時導致session中的session.username的值為空。對一個為 null的對象的直接執行toString()操作,就會導致系統拋出(Java.lang.NullPointerException)空指針異常。

解決方案:

為了確保進行操作或引用的對象非空,假若我們要對某對象進行操作或引用,我們首先去檢查該對象是否已經實例化且不為空;並且在系統中加入針對對象為空時情況的處理。
如:採用String對象保存用戶提交的結果;在如果涉及對象的操作時,先檢測其是否為空後,檢查到對象為空後,可再選擇進行以下任一種處理方式:
處理方式 1) 檢查到對象為空時,設置對象值為空字元串或一個默認值;
處理方式 2) 檢測到對象為空時,根本不執行某操作,直接跳轉到其他處理中。
處理方式 3) 檢查到對象為空時,提示用戶操作有錯誤。
將代碼段2按以上方式進行改寫,得到:
方式1:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串
If (userName == null)
userName = "";
If (userName.equals("root"))
{..........}
方式2:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串,不執行有關操作。
If (usreName != null)
{
If (userName.equals("root"))
{..........}
}
方式3:
String userName = request.getParameter("username");
// 該變數值為空時,轉化為默認空字元串,不執行有關操作。
If (usreName == null)
{// 提示用戶輸入信息為空
}
實際中,上面提供到三種處理方式也同樣適用於其他異常的處理:
異常處理方式 1) 檢查到異常出現,設置對象值為空字元串或一個默認值;
異常處理方式 2) 檢測到異常出現,根本不執行某操作,直接跳轉到其他處理中。
異常處理方式 3) 檢查到異常出現,提示用戶操作有錯誤。

閱讀全文

與java空指針處理相關的資料

熱點內容
imap伺服器怎麼填寫蘋果自帶郵箱 瀏覽:705
瑪氏程序員 瀏覽:612
整式運演算法則八年級 瀏覽:949
行政公文寫作中的命令 瀏覽:396
安卓代碼反編譯保護 瀏覽:821
程序員桌面顯示屏搭建 瀏覽:588
程序員眼中的釘釘 瀏覽:636
ultraedit程序編譯是哪個 瀏覽:527
什麼樣的程序員是最好的程序員 瀏覽:970
app更新包是什麼意思 瀏覽:624
電銀付app入網綁定設備什麼意思 瀏覽:186
編譯原理圖形學操作系統 瀏覽:144
linuxipsec客戶端 瀏覽:173
新版標准日本語初級下冊pdf 瀏覽:401
照片拼在一起用什麼app 瀏覽:679
博士老師跳槽做程序員 瀏覽:634
毛概教材2015pdf 瀏覽:801
editplus開發php 瀏覽:999
用什麼app可以知道自己適合什麼頭型 瀏覽:933
android應用案例開發大全pdf 瀏覽:256