请告知通过应用谨慎或防御性编码技术和null安全API方法,避免避免NullPointerException的最佳方法是什么。在java中进行编码的时候,我分析的一件事是放空检查,是否有任何自定义模板,你也可以建议我们可以使用的eclipse编辑器。!!
答案 0 :(得分:4)
好吧,如果你调用一个函数并且null是一个可能的返回值,那么你必须检查它。另一方面,如果你在任何地方检查空值,那就太过防御并使代码混乱。如果您有权访问源代码和/或javadoc,则可以检查该函数是否返回null或不返回。
有时如果你期望一个值,但是变量是null,你必须抛出一个异常,因此NPE在这种情况下很有用,因为其他地方都有错误。
此外,还有一些注释,如@NonNull或@Nullable,一些静态分析检查器(如Findbugs)用来帮助它们捕获可能的空指针问题。
对于您正在构建的函数,请检查返回null是否有意义。例如,如果函数返回一个集合,则返回空集合和返回null之间存在差异。
更多阅读:Null Object Pattern
答案 1 :(得分:1)
在操作对象之前检查空取消引用。
if(something!= null) //做圆顶的事。
如果您希望解除空取消引用,请使用yoda表示法。
如果( “是” .equals(东西) //做点什么
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)