【发布时间】:2014-02-07 10:26:50
【问题描述】:
背景
有时,函数在某些情况下返回 null,但使用它们的人并没有意识到这一点,因此 NPE 是不可避免的。
例如(它只是一个示例,以说明我在说什么):
public class Test
{
public static void main(final String[] args)
{
final int t=0;
System.out.println("result:"+foo(t).toString()); // no warning here...
}
public static String foo(final int t)
{
if(t>0)
return "positive";
else return null;
}
}
问题
Eclipse 不会警告这样的事情,甚至在设置中也没有。
只有在不涉及任何功能时才能检测到此类问题(请参阅下面的我的编辑)。
不仅如此,我还找不到说明返回值可以为空的注释。我认为它有相反的效果。
我尝试过的
所以我认为由于 Eclipse 没有一些检查(这很好),我可以使用替代的静态代码分析工具,例如 FindBugs 和 CodePro Analytix 。两者都未能找到此类错误。
我已尝试联系这两个项目,但尚未得到任何答复。对于 CodePro,我什至不确定我是否做对了……事实上,我认为这个项目已经停止(最后一次更新是 2010 年……)。
问题
是否有任何工具可以帮助避免此类错误?
编辑:由于许多人认为这可以通过更改代码来解决,因此请考虑在一个庞大的团队中工作,而有些人可能已经忘记了它(每个人都可能犯错误)。或者,您甚至可能正在开发一个使用 SDK(甚至可能是封闭源代码)的项目,该 SDK 在某些情况下可能返回 null,但由于 SDK 的创建者忘记了它,因此没有记录在案。
无论你是一名多么优秀的程序员,这种事情都可能发生。
我要求的是通过让 eclipse 帮助来克服这个问题的方法。它应该能够警告我,至少在我在这里写的基本示例上。
Eclipse 应该能够进行这样的检查,就像它可以警告我这个例子一样:
int t=0;
--t;
String s="s";
if(t<0)
s=null;
System.out.println(s.toString()); // here you will get a warning
当你在 Eclipse 的设置中启用它时可以检测到:
Java-> Compiler-> Errors/Warning-> Potential null pointer access
我喜欢 Eclipse,因为它有很多很酷的警告和错误,可以帮助避免错误,但我上面写的内容无法被它检测到,甚至无法被我谈到的工具检测到。
许多错误很难找到,没有人是不犯错误的完美程序员。即使您确实知道很多,您也不会受到其他人的错误的保护。人们甚至可能无法找到基本代码的问题(请参阅here、here 或只是here,看看你自己能找到多少错误)。这就是为什么有一些工具可以帮助您。
【问题讨论】:
-
首先,您应该考虑返回
null是否是一种好习惯。 :) -
考虑使用Optional 样式结构来表示意图;有one in Guava。
-
@Gimby 即使我添加了 javadocs,它也不会强迫人们阅读它。此外,我也可能会因为忘记添加 JavaDocs 而犯错,甚至可能使用没有说明获取 null 值的可能性的 SDK。我试图表明我所写的只是一个示例,但请考虑获得这样一个东西的所有可能选择 - 无论你作为一名程序员有多优秀,它都可能发生。
-
@McDowell 您并不总是有机会编写您正在使用的代码。有时您使用 SDK 或在一个庞大的团队中工作。
-
FWIW Netbeans 也是如此 - 方法没有警告,但内联时会发出警告。
标签: java eclipse nullpointerexception eclipse-jdt static-code-analysis