请告知通过应用谨慎或防御性编码技术和空安全 API 方法来避免 NullPointerException 的最佳方法是什么。特别是在使用 java 编码时,我分析的一件事是进行空检查,是否有任何自定义模板,您也可以为我们可以使用的 eclipse 编辑器提供建议..!!
3 回答
好吧,如果你调用一个函数并且 null 是一个可能的返回值,那么你必须检查它。另一方面,如果你到处检查 null ,这将过于防御性并使代码混乱。如果您有权访问源代码和/或 javadoc,则可以检查该函数是否会返回 null。
有时,如果您期望一个值但变量为空,则必须抛出异常,因此 NPE 在这种情况下可能很有用,因为其他地方存在错误。
此外,还有一些像 @NonNull 或 @Nullable 这样的注解,一些静态分析检查器(如 Findbugs)使用这些注解来帮助他们捕捉可能的空指针问题。
对于您正在构建的函数,请检查返回 null 是否有意义。例如,如果你的函数返回一个集合,那么返回一个空集合和返回 null 是有区别的。
更多阅读:空对象模式
在对对象进行操作之前检查 null 取消引用。
if(something != null) // 做圆顶的事情。
如果您希望取消空解引用,请使用 yoda 表示法。
if("yes".equals(something) // 做某事
Eclipse 编辑器插件?也许您可以使用样式检查。
一种有用的模式是选项模式。它在 Scala 中被广泛使用,这里讨论了一个 Java 等价物。
简而言之,不是返回对对象的引用,而是返回一个 Option 对象。一个子类 (Some) 包含引用,而另一个子类 (None) 不包含。因此,API 明确声明您可能无法取回值。你必须确定你得到了什么才能取回基础参考。
例如(伪代码)
Option<String> value = findNameForId(34);
if (value instanceof Some) {
return ((Some<String>)value).get();
}
else {
throw new Exception();
}
它在 Java 中相当冗长,但在 Scala 中则要少得多。
findNameForId(34) match {
case Some(id) => id
case None => throw new Exception
}
您可以在 Scala 中使其更加简洁,即:
findNameForId(34).getOrElse(throw new Exception)
或者
findNameForId(34).getOrElse(DefaultValue)