您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何降低NPE,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
程序員,如果系統(tǒng)突然報了一個空指針異常,你肯定像吞了一只蒼蠅一樣尷尬。
那么如何在日常開發(fā)過程中降低NPE?
問題 | 回答 |
---|---|
現(xiàn)狀 | 返回空值會出現(xiàn)大量的空指針異常 |
目的 | 改進方法的返回值,降低出現(xiàn)空指針異常 |
實現(xiàn)路徑 | 方法返回空集合或者空數(shù)組 |
跟我來!
下面的方法看起來很常見。
private final List<Chesse> chessesInStock= ... public List<Cheese> getCheeses(){ return cheesesInStock.isEmpty()?null:new ArrayList<>(cheesesInStock); }
假如你去購買芝士的時候沒有可用的芝士,似乎沒有理由特別指出這種場景。
但是你這么做的話,客戶端需要添加額外代碼來處理可能返回空值的情況。示例代碼如下:
List<Cheese> cheeses = shop.getCheeses(); if(cheses != null && cheeses.contains(Cheese.STILTON)){ System.out.println("jolly good"); }
每一個返回空值的方法都使用上面這種處理方式,應(yīng)該替換為返回一個空集合或者空數(shù)組。
這是一種錯誤的趨勢,因為程序員些客戶端代碼可能會忘記寫特殊代碼來處理返回的空值。
這個錯誤可能會持續(xù)很長時間,因為這樣的方法通常會返回一個或多個對象。
返回空值替換為返回空容器也會使得方法的實現(xiàn)變得復雜。
通常爭論的是:返回空值比返回空集合更好是因為創(chuàng)建一個空的容器有性能消耗。
這個論點不對,原因有兩點:
一,沒有必要擔心性能除非有證據(jù)顯示創(chuàng)建一個空容器整的有損性能;
二,你可以返回一個空集合或者數(shù)組而不用創(chuàng)建它們。
下面是一個典型的代碼返回一個可能的空集合,通常,這就是你所需要的。
public List<Cheese> getCheeses(){ return new ArrayList<>(cheeseInStock); }
沒有證據(jù)證明創(chuàng)建一個空集合會有損性能,你可以返回一個相同的不可變空集合來避免創(chuàng)建空集合。因為不可變對象是可以被自由共享的,下面是使用代碼。
需求場景 | 代碼 |
---|---|
空List | Collections.emptyList() |
空Set | Collections.emptySet() |
空Map | Collections.emptyMap() |
但是記住,以上這些操作是只是優(yōu)化,很少被調(diào)用,如果你認為你需要它,在調(diào)用前后進行性能對比,確保它真的有用。
public List<Cheese> getCheeses(){ return cheesesInStock.isEmpty()?Collections.emptyList():new ArrayList<>(cheesesInStock); }
使用數(shù)組的場景跟集合是相同的,永遠不要返回空值,應(yīng)該返回一個長度位0的數(shù)組,常常,你應(yīng)該簡單的返回一個有適當長度的數(shù)組,也許長度是0。
注意我們傳遞一個長度為0的數(shù)組到toArray方法中來代表期望的返回類型;
public Cheese[] getCheeses(){ return cheesesInStock.toArray(new Cheese[0]); }
如果你認為創(chuàng)建一個長度為0的數(shù)組會降低性能,你可以返回同一個長度為0的數(shù)組,因為所有長度為0的數(shù)組都是不可變的;
private static final Cheese[] EMPTY_ARRAY= new Cheese[0]; public Cheeses[] getCheeses(){ return cheesesInStock.toArray(EMPTY_ARRAY); }
在優(yōu)化版本中,我們傳遞了同一個空的數(shù)組到每一個toArray的調(diào)用,這個數(shù)組將會從getCheeses返回,無論cheesesInStock是不是空的,不要期望預分配數(shù)組可以提高性能,研究顯示這是適得其反的。
return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);
如果你只能記住一句話:返回空集合或者數(shù)組而不要返回空值。
返回空值會讓你的API更難使用并且更容易出錯,并且無性能優(yōu)勢。
上述內(nèi)容就是如何降低NPE,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。