如何避免java中的空指针异常

时间:2015-04-01 08:20:34

标签: java exception-handling nullpointerexception

我很想知道避免NullPointerException的正确方法。

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

这里我只是捕捉并显示异常消息。我想知道处理这种情况或避免这种情况的正确方法。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

除了捕获错误之外,如果你打算使用可能为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) {....}