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

How to avoid null pointer exception in java

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

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

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

您能否详细说明避免 NPE 的意思?它可以通过多种方式完成。在您的情况下,您不应该将 null 传递到您的字符串中。

其他 SO 用户教给我的一般规则是 总是 尽早捕获 NPE(以避免在整个应用程序中造成附带损害)。

对于参数验证,您很可能需要使用 Objects#requireNonNull

你也可以根据场景声明一个简单的if语句,像这样- if (name != null)


您还必须意识到,在某些情况下可能需要 null,因此处理此类 NPE 会有所不同。如果您实际上不打算对 Exception 执行某些操作,则不应捕获它,因为捕获异常然后简单地丢弃它可能有害。 下面讨论什么时候应该抛出异常 - When to throw an exception?


经过进一步调查,似乎 Java 1.8 还提供了一个新的 Optional class ( java.util.Optional ),这似乎非常有用且更清晰。看看这个Oracle document

除了捕获错误之外,如果您要处理可能为空的内容,您可能需要进行空检查。

你可以做些什么来减少必须进行空检查的机会,永远不要从你的方法中 return null ,除非确实有必要,例如:

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

     //As opposed to returning null
     return null;
}

通过 return 空列表,对上述代码的调用将导致如下结果:for(String name : this.getUserNames()) {...}。如果没有找到用户名,循环将不会执行。

如果另一方面,您 return 为 null,则需要执行以下操作:

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