首頁 Java java教程 Java如何避免出現NullPointerException的方法

Java如何避免出現NullPointerException的方法

Sep 07, 2017 am 10:31 AM
java nullpointerexception 出現

這篇文章主要介紹了java 避免出現NullPointerException(空指標)的方法總結的相關資料,需要的朋友可以參考下

java 避免出現NullPointerException(空指標)的方法總結

Java應用程式中拋出的空指標例外是解決空指標的最佳方式,也是寫出能順利工作的健壯程式的關鍵。俗話說“預防勝於治療”,對於這麼令人討厭的空指針異常,這句話也是成立的。值得慶幸的是運用一些防禦性的編碼技巧,追蹤應用中多個部分之間的聯繫,你可以將Java中的空指針異常控制在一個很好的水平上。順便說一句,這是Javarevisited上的第二個空指標異常的貼文。在上個帖子中我們討論了Java中導致空指標異常的常見原因,而在本教程中我們將會學習一些Java的程式設計技巧和最佳實踐。這些技巧可以幫助你避免Java中的空指標異常。遵從這些技巧同樣可以減少Java程式碼中到處都有的非空檢查的數量。作為一個有經驗的Java程式設計師,你可能已經知道其中的一部分技巧並且應用在你的專案中。但對於新手和中級開發人員來說,這將是值得學習的。順便說一句,如果你知道其它的避免空指標異常和減少空指標檢查的Java技巧,請和我們分享。

這些都是簡單的技巧,很容易應用,但是對程式碼品質和健全性有顯著影響。根據我的經驗,只有第一個技巧可以顯著改善程式碼品質。如我之前所講,如果你知道任何避免空指針異常和減少空指針檢查的Java技巧,你可以透過評論本文來和分享。

1) 從已知的String物件呼叫equals()和equalsIgnoreCase()方法,而非未知物件。

總是從已知的非空String物件呼叫equals()方法。因為equals()方法是對稱的,呼叫a.equals(b)和呼叫b.equals(a)是完全相同的,這也是為什麼程式設計師對物件a和b這麼不上心。如果呼叫者是空指針,這種呼叫可能會導致一個空指針異常


Object unknownObject = null;

//错误方式 – 可能导致 NullPointerException
if(unknownObject.equals("knownObject")){
  System.err.println("This may result in NullPointerException if unknownObject is null");
}

//正确方式 - 即便 unknownObject是null也能避免NullPointerException
if("knownObject".equals(unknownObject)){
  System.err.println("better coding avoided NullPointerException");
}
登入後複製

這是避免空指針異常最簡單的Java技巧,但能夠導致巨大的改進,因為equals()是常見方法。

2) 當valueOf()和toString()傳回相同的結果時,寧願使用前者。

因為呼叫null物件的toString()會拋出空指標異常,如果我們能夠使用valueOf()得到相同的值,那寧願使用valueOf(),傳遞一個null給valueOf()將會傳回“null”,尤其是在那些包裝類,像Integer、Float、Double和BigDecimal。


BigDecimal bd = getPrice();
System.out.println(String.valueOf(bd)); //不会抛出空指针异常
System.out.println(bd.toString()); //抛出 "Exception in thread "main" java.lang.NullPointerException"
登入後複製

3) 使用null安全性的方法和函式庫 有許多開源程式庫已經為您做了繁重的空指標檢查工作。 其中最常用的一個的是Apache commons 中的StringUtils。你可以使用StringUtils.isBlank(),isNumeric(),isWhiteSpace()以及其他的工具方法而不用擔心空指標異常。


//StringUtils方法是空指针安全的,他们不会抛出空指针异常
System.out.println(StringUtils.isEmpty(null));
System.out.println(StringUtils.isBlank(null));
System.out.println(StringUtils.isNumeric(null));
System.out.println(StringUtils.isAllUpperCase(null));

Output:
true
true
false
false
登入後複製

但是在做出結論之前,不要忘記閱讀空指標方法的類別的文件。這是另一個不需要下大功夫就能得到很大改進的Java最佳實踐。

4) 避免從方法傳回空指針,而是傳回空collection或空數組。

這個Java最佳實踐或技巧由Joshua Bloch在他的書Effective Java中提到。這是另外一個可以更好的使用Java程式設計的技巧。透過傳回一個空collection或空數組,你可以確保在呼叫如size(),length()的時候不會因為空指標異常崩潰。 Collections類別提供了方便的空List,Set和Map: Collections.EMPTY_LIST,Collections.EMPTY_SET,Collections.EMPTY_MAP。這裡是實例。


public List getOrders(Customer customer){
  List result = Collections.EMPTY_LIST;
  return result;
}
登入後複製

你同樣可以使用Collections.EMPTY_SET和Collections.EMPTY_MAP來取代空指標。

5) 使用annotation@NotNull 和@Nullable

在寫程式的時候你可以定義是否可為空指針。透過使用像@NotNull和@Nullable之類的annotation來宣告一個方法是否是空指標安全的。現代的編譯器、IDE或工具可以讀此annotation並幫你添加忘記的空指針檢查,或者向你提示出不必要的亂七八糟的空指針檢查。 IntelliJ和findbugs已經支援了這些annotation。這些annotation同樣是JSR 305的一部分,但即便IDE或工具中都沒有,這個annotation本身可以當作文件。看到@NotNull和@Nullable,程式設計師自己可以決定是否做空指標檢查。順便說一句,這個技巧對Java程式設計師來說相對比較新,要採用需要一段時間。

6) 避免你的程式碼中不必要的自動包裝和自動解包。

且不管其他如建立臨時物件的缺點,如果wrapper類別物件是null,自動包裝同樣容易導致空指標異常。例如如果person物件沒有電話號碼的話會回傳null,如下程式碼會因為空指標而異常崩潰。


Person ram = new Person("ram");
int phone = ram.getPhone();
登入後複製

当使用自动包装和自动解包的时候,不仅仅是等号,< > 同样会抛出空指针异常。你可以通过这篇文章来学习更多的Java中的自动包装和拆包的陷阱。

7) 遵从Contract并定义合理的默认值。

在Java中避免空指针异常的一个最好的方法是简单的定义contract并遵从它们。大部分空指针异常的出现是因为使用不完整的信息创建对象或者未提供所有的依赖项。如果你不允许创建不完整的对象并优雅地拒绝这些请求,你可以在接下来的工作者预防大量的空指针异常。类似的,如果对象允许创建,你需要给他们定义一个合理的默认值。例如一个Employee对象不能在创建的时候没有id和name,但是是否有电话号码是可选的。现在如果Employee没有电话号码,你可以返回一个默认值(例如0)来代替返回null。但是必须谨慎选择,哟有时候检查空指针比调用无效号码要方便。同样的,通过定义什么可以是null,什么不能为null,调用者可以作出明智的决定。failing fast或接受null同样是一个你需要进行选择并贯彻的,重要的设计决策

8)定义数据库中的字段是否可为空。

如果你在使用数据库来保存你的域名对象,如Customers,Orders 等,你需要在数据库本身定义是否为空的约束。因为数据库会从很多代码中获取数据,数据库中有是否为空的检查可以确保你的数据健全。在数据空中维护null约束同样可以帮助你减少Java代码中的空指针检查。当从数据库中加载一个对象是你会明确,哪些字段是可以为null的,而哪些不能,这可以使你代码中不必要的!= null检查最少化。

9) 使用空对象模式(Null Object Pattern)

还有一种方法来避免Java中的空指针异常。如果一个方法返回对象,在调用者中执行一些操作,例如Collection.iterator()方法返回迭代器,其调用者执行遍历。假设如果一个调用者并没有任何迭代器,其可以返回空对象(Null object)而非null。空对象是一个特殊的对象,其在不同的上下文中有不同的意义。例如一个空的迭代器调用hasNext()返回false时,可以是一个空对象。同样的在返回Container和Collection类型方法的例子中,空对象可以被用来代替null作为返回值。我打算另写一篇文章来讲空对象模式,分享几个Java空对象的例子。

这就是全部了,这是几个易于遵从的避免空指针异常的Java技巧和最佳实践。你可以欣赏到这些技巧将非常有用,且不太难实现。如果你有其他比秒这个异常的技巧,而又没包含在这里,请通过评论来和我们分享,我将收录在这里。

以上是Java如何避免出現NullPointerException的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP:許多網站的基礎 PHP:許多網站的基礎 Apr 13, 2025 am 12:07 AM

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。

PHP與Python:用例和應用程序 PHP與Python:用例和應用程序 Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

See all articles