0

请告知通过应用谨慎或防御性编码技术和空安全 API 方法来避免 NullPointerException 的最佳方法是什么。特别是在使用 java 编码时,我分析的一件事是进行空检查,是否有任何自定义模板,您也可以为我们可以使用的 eclipse 编辑器提供建议..!!

4

3 回答 3

4

好吧,如果你调用一个函数并且 null 是一个可能的返回值,那么你必须检查它。另一方面,如果你到处检查 null ,这将过于防御性并使代码混乱。如果您有权访问源代码和/或 javadoc,则可以检查该函数是否会返回 null。

有时,如果您期望一个值但变量为空,则必须抛出异常,因此 NPE 在这种情况下可能很有用,因为其他地方存在错误。

此外,还有一些像 @NonNull 或 @Nullable 这样的注解,一些静态分析检查器(如 Findbugs)使用这些注解来帮助他们捕捉可能的空指针问题。

对于您正在构建的函数,请检查返回 null 是否有意义。例如,如果你的函数返回一个集合,那么返回一个空集合和返回 null 是有区别的。

更多阅读:空对象模式

于 2012-08-15T12:25:24.163 回答
1
  1. 在对对象进行操作之前检查 null 取消引用。

    if(something != null) // 做圆顶的事情。

  2. 如果您希望取消空解引用,请使用 yoda 表示法。

    if("yes".equals(something) // 做某事

Eclipse 编辑器插件?也许您可以使用样式检查。

于 2012-08-15T12:24:03.000 回答
0

一种有用的模式是选项模式。它在 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)
于 2012-08-15T13:14:59.727 回答