2015-04-01 45 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