CMP.OBJ

如果比较的是对象引用而不是对象本身,将出现此警告。仅当比较的对象具有不同类型,且它们都不是显式 Object 类型时,才会报告错误。

漏洞与风险

此问题可能导致意外的应用程序行为。通常,使用 == 比较对象会产生欺骗性结果,因为 == 运算符比较的是对象引用而不是它们的值。要在字符串中使用 ==,程序员必须确保这些对象在程序中是唯一的,即它们没有已定义的 equals 方法,或者它们拥有可产生唯一对象的静态工厂。

缓解与预防

使用 equals() 方法代替 == 运算符来比较对象。如果使用 == 运算符,出于性能原因,请务必确保对象由静态工厂创建,而不是构造函数。

示例 1

复制
      /**
      * Check that person is John 25 miner
      */
     Proffesional john = new Proffesional("John", 25, "miner");
     public boolean checkJohn(Person p) {
         return p == john;
     }

针对第 14 行报告 CMP.OBJ:使用 == 运算符比较对象“p”和“john”