Java 字符串比较中文字的正确位置是什么?

Java 字符串比较中文字的正确位置是什么?,java,pmd,Java,Pmd,我有 但是PMD说 if (localName.equals("TaxName")) { “TaxName”.equals(localName)更好,因为如果localName为空,则不会出现空指针异常。我更喜欢先定位文本,即: Position literals first in String comparisons 通过这种方式,您可以对null的情况进行正确的比较,而不是获取NullPointerException。PMD还应该告诉您它生成此警告的原因。从PMD网站: 在字符串比较中首

我有

但是PMD说

if (localName.equals("TaxName")) {

“TaxName”.equals(localName)
更好,因为如果
localName
为空,则不会出现空指针异常。

我更喜欢先定位文本,即:

Position literals first in String comparisons

通过这种方式,您可以对null的情况进行正确的比较,而不是获取NullPointerException。

PMD还应该告诉您它生成此警告的原因。从PMD网站:

在字符串比较中首先定位文本-这样,如果字符串为null,则不会得到NullPointerException,它只会返回false


就我个人而言,这对我来说毫无意义。如果代码捕获到一个NullPointerException,那么它就完成了以后不必做的工作。如果localName最终为null,并且这会导致以后出现问题,那么就很难进行跟踪。不要为了使编译器满意而更改代码。如果您的代码抛出NullPointerException,则可以节省您以后的调试时间。

为了避免该警告,一个更简单的解决方案是在之前检查nullpointers,建议在我们管理的每个对象中使用它,而不仅仅是在这种情况下:

if ("TaxName".equals(localName)) { ...

好吧,如果PMD抱怨文字在右边,我想除了把它们放在左边(又名样式)你没有其他选择了:)我完全不同意,而且肯定更喜欢写
CONSTANT.equals(variable)
而不是进行初步的
null
检查。如果localName为null,您稍后尝试使用它,您将获得与原始代码完全相同的效果,即NPE。但是,更重要的是,我们应该让编译器感到高兴——它知道自己在做什么。我甚至建议您进入所选IDE的编译器设置,并将所有这些编译器警告升级为错误。@CurtainDog将编译器警告升级为错误将有效地使我公司的生产力停滞一年。我相信90%的人都会同意。我并不是说你原则上是不对的,因为这些警告经常会变成错误,我只是说说说起来容易做起来难。@PascalThivent:If
null
将是变量的合法值,该变量应被视为不等于字符串,测试文本是否与变量相等比手动测试变量是否为null然后与字符串进行比较容易。但是,如果null不是变量的合法值,那么说
variable.Equals(“Literal”)
将有效地免费提供
Assert(variable!=null)
。在某些情况下,如果变量为null,代码应将其视为不等于字符串。在其他情况下,它表示存在问题,标记问题的速度越快越好。在后一种情况下,
variable.equals(“literal”)
更好,因为如果variable为null,它将被捕获。只有考虑到这一点,这才更好。就我个人而言,我记不起这样一种情况:我的代码中没有错误,我想尽快发现。用regex替换:
([a-zA-Z][^]+)\.equals\(“[^”]*”)
替换为:
\2.equals(\1)
if (localName!=null && localName.equals("TaxName")) {
    ...
}