2015-04-01 78 views
3

我很想知道正確的方法來避免NullPointerException s。如何避免java中的空指針異常

try 
{ 
    String name = null; 
    System.out.println("name=" + name.toString()); 
} 
catch(Exception e) 
{ 
    System.out.println("Exception Occured" + e.getMessage()); 
} 

這裏我只是捕捉並顯示異常消息。我想知道處理這種情況或避免這種情況的正確方法。

+2

不要將它設置成'null'擺在首位。爲什麼不使用空字符串''「'? – JonK 2015-04-01 08:22:41

+0

我同意@JonK,而且如果你不是那個把它設置爲null的人,你總是可以檢查值'if(name!= null)'。 – 2015-04-01 08:24:17

回答

4

除了捕獲錯誤,如果要使用可能爲null的某些東西,則可能需要使用空檢查。

,你可以做些什麼來減少不必進行null檢查的機會,將是永遠不會從你的方法返回null,除非確有必要,例如:

public IList<String> getUserNames() 
{ 
    //No usernames found... 
    return new ArrayList<String>(); 

    //As opposed to returning null 
    return null; 
} 

通過返回空列表,對上述代碼的調用會導致如下所示:for(String name : this.getUserNames()) {...}。如果找不到用戶名,則循環將不會執行。

如果在另一方面,你返回null,你需要做一些事情,像這樣:

List<String> userNames = this.getUsernames(); 
if(userNames != null) 
    for(String userName : userNames) {....} 
+1

他可以使用Java 1.8的'Optional'來總是避免它 – Loki 2015-04-01 08:26:54

+0

@Loki:我不知道OP使用的是什麼版本,所以我試着用最通用的版本,但除此之外,是的,我猜OP可以使用「可選」方法。 – npinti 2015-04-01 08:30:57

4

你能詳細說明你的意思是避免NPE嗎?它可以用很多方式完成。在你的情況下,你不應該通過null到你的字符串。

已經被同伴SO用戶告知我的一般規則是總是儘可能早地捕捉NPE(以避免整個應用程序的附帶損害)。

對於參數驗證,您最有可能需要使用Objects#requireNonNull

你可能需要聲明一個簡單的if語句根據情況,像這樣 - if (name != null)


還必須認識到,在某些情況下,null可能需要,因此處理這樣的NPE會有所不同。如果你不打算用Exception做些什麼,它不應該被捕獲,因爲它可能有害於捕捉異常,然後丟棄它。 時,你應該拋出一個異常或沒有下面討論 - When to throw an exception?


經進一步調查,似乎Java的1.8還提供了一個新的Optional類(java.util.Optional)這似乎是非常有用的,更清潔。看看這個Oracle document