Java 当我将字符串与==而不是.equals()进行比较时,如何让Eclipse发出警告

Java 当我将字符串与==而不是.equals()进行比较时,如何让Eclipse发出警告,java,eclipse,Java,Eclipse,我知道这一点,我理解其原因。然而,有时我会忘记并错误地将字符串与==进行比较。我希望Eclipse(比我聪明得多)能够通过执行以下一项或多项操作来警告我: 在我的错误下划一条扭曲的红线并指出错误 在我修复错误之前拒绝编译我的代码 帮我纠正错误 用最近的约书亚·布洛赫的书打我的头直到我道歉 在Eclipse3.5中,您可以让Eclipse通过进入窗口>首选项>编译器>错误/警告来警告您所有的事情,但遗憾的是,“将字符串与==而不是.equals()进行比较”似乎不是其中之一。我只是错过了吗?是

我知道这一点,我理解其原因。然而,有时我会忘记并错误地将字符串与
==
进行比较。我希望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更能报告错误

有两种错误报告类别:

我想补充一下“这个警告有用吗?”

我已经将HTML5游戏中的许多JavaScript代码转换为Android游戏。 在JavaScript中,字符串与“=”进行比较。 它们以这种方式转换为Java。
所以我需要一个工具来确保我用“.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插件来警告您类似的事情