关于空指针异常避免安全措施

时间:2012-08-15 12:17:53

标签: java exception nullpointerexception

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

3 个答案:

答案 0 :(得分:4)

好吧,如果你调用一个函数并且null是一个可能的返回值,那么你必须检查它。另一方面,如果你在任何地方检查空值,那就太过防御并使代码混乱。如果您有权访问源代码和/或javadoc,则可以检查该函数是否返回null或不返回。

有时如果你期望一个值,但是变量是null,你必须抛出一个异常,因此NPE在这种情况下很有用,因为其他地方都有错误。

此外,还有一些注释,如@NonNull或@Nullable,一些静态分析检查器(如Findbugs)用来帮助它们捕获可能的空指针问题。

对于您正在构建的函数,请检查返回null是否有意义。例如,如果函数返回一个集合,则返回空集合和返回null之间存在差异。

更多阅读:Null Object Pattern

答案 1 :(得分:1)

  1. 在操作对象之前检查空取消引用。

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

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

    如果( “是” .equals(东西)   //做点什么

  3. Eclipse编辑器插件?也许你可以使用风格检查。

答案 2 :(得分:0)

一种有用的模式是Option模式。它在Scala中被广泛使用,并且讨论了Java等价物here

简单地说,您返回一个Option对象,而不是返回对象的引用。一个子类(Some)包含引用,另一个子类(None)不包含引用。因此,API明确声明您可能没有获得值。您来确定您获得的内容以获取基础参考。

e.g。 (伪代码)

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)