Java 当我将字符串与==而不是.equals()进行比较时,如何让Eclipse发出警告
我知道这一点,我理解其原因。然而,有时我会忘记并错误地将字符串与Java 当我将字符串与==而不是.equals()进行比较时,如何让Eclipse发出警告,java,eclipse,Java,Eclipse,我知道这一点,我理解其原因。然而,有时我会忘记并错误地将字符串与==进行比较。我希望Eclipse(比我聪明得多)能够通过执行以下一项或多项操作来警告我: 在我的错误下划一条扭曲的红线并指出错误 在我修复错误之前拒绝编译我的代码 帮我纠正错误 用最近的约书亚·布洛赫的书打我的头直到我道歉 在Eclipse3.5中,您可以让Eclipse通过进入窗口>首选项>编译器>错误/警告来警告您所有的事情,但遗憾的是,“将字符串与==而不是.equals()进行比较”似乎不是其中之一。我只是错过了吗?是
==
进行比较。我希望Eclipse(比我聪明得多)能够通过执行以下一项或多项操作来警告我:
- 在我的错误下划一条扭曲的红线并指出错误
- 在我修复错误之前拒绝编译我的代码
- 帮我纠正错误
- 用最近的约书亚·布洛赫的书打我的头直到我道歉
==
是一种有效的java语言功能。在某些情况下,你会想做这件事。然后呢
也许有一天,某个程序员会希望IDE在他编写
i=10
时警告他(而不是i==10
)
幸运的是,这是人类接管机器的地方,我们都有自己的工作:)
可悲的是,有这么多有缺陷的系统:(
我相信,随着时间的推移,您将养成使用
equals()
表示字符串的习惯,Eclipse永远不会告诉您这一点,或者可能会告诉您
编辑:我说
Eclipse永远不会告诉你这一点 因为代码
a==b
作为java代码没有什么错。如果您需要一些额外的帮助,这就是其他插件提供帮助的地方
编辑:根据Pascal Thivent的说法,Findbugs不能做到这一点,但看起来PMD可以做到。不过,我留下了Findbugs的链接,因为对于遇到这个问题的人来说,它可能是一个有用的链接。
错误39095-RFE:使用比较非原语时发出警告==
如果编译器允许在使用==进行比较时发出警告,那就太好了
非基元类型,因此字符串与==,进行比较,而这是一种有效的方法
如果您正在实习并使用字符串池,则可以在编译时捕获
警告,而不是运行时不明显的故障
与前面评论中所说的相反,FindBug(现在?)可以检测到这种比较错误。 在我的例子中,FindBug比PMD更能报告错误 有两种错误报告类别:
所以我需要一个工具来确保我用“.equals(”.我所见过的将==与字符串一起使用的唯一好理由是证明==和equals可能会做不同的事情。不过,你对这个习惯的看法是对的。我几乎有这个习惯,但我偶尔会犯错。实际上是复制粘贴错误促使我问这个问题,所以也许我应该更谨慎一些可能有一天,某个程序员在写i=10(而不是i==10)时会希望IDE警告他。Eclipse已经这样做了。它处于“潜在编程问题”之下,被称为“可能的意外布尔赋值”。我不明白你为什么会认为这是一件坏事。别忘了
String.intern()
。可以通过引用或值等效地比较Interned字符串。IntelliJ在检查时会做他要求的事情。因此这当然是可能的。它与asker给出的选项1相同(在代码中标记为警告)。这是一个有效的请求!从回答中可以看出,这两个插件似乎都是Eclipse的插件,所以事实上Eclipse可以告诉我。我宁愿不下载任何东西,但这是一个选项。说“Eclipse永远不会告诉你这一点”没有任何意义。Eclipse和任何插件都不能保证a==b
是错误的。它是Eclipse编译器警告和外部插件可以警告之间的浮动边界。我不确定Findbugs是否会显示这种错误,但它显示了许多类似的错误(我很少比较字符串,然后我可能会记得使用.equals()或.contentEquals()“可能可以”并不是真正的答案(Findbugs没有检测到)。PMD会这样做:(使用equalstocomparestrings规则)+1,为什么人们对此投反对票?这不是一个真正的问题吗?@MatrixFrog:IntelliJ IDEA很长一段时间以来一直在解决你的问题1和问题3。它甚至告诉你:“字符串值是用“==”来比较的,而不是“.equals()”,因为它支持按alt+enter(或任何你的快捷方式)进行编程这对你来说是固定的。如果你感兴趣,现在有一个IntelliJ IDEA的开源版本。如果你有一个IDE可以用Joshua Bloch的书打败程序员,请告诉我。我对此非常感兴趣。:-)Jesper,我同意如果IDE可以说出来,而不是让有书的程序员来检查你的代码,那将是一件好事:)您可以编写自己的Eclipse插件来警告您类似的事情