FINDBUGS错误分析日志

本文详细解析了FINDBUGS错误,包括不同类型的问题及其原因,如:不正确的equals()比较、未覆盖父类equals方法、缺少serialVersionUID、类名与超类名冲突等,并提供了相应的修复建议和最佳实践,帮助开发者改进代码质量。
摘要由CSDN通过智能技术生成
1.Call to equals() comparing different type

大部分都是类型永远不会有这种情况 比如a为DOUBLE类型所以EQUALS只匹配字符串 if(a.equals())或if(a.quals())这类判断是根本不会有用的的

2.Class doesn't override equals in superclass

super.equals(obj) 调用父类equals方法 一般都是Object的方法,所以这个super可写可不写,一般都是 为了代码的可读性才加上去的

一般就是重写equals(obj)即可 即public boolean equals(Object obj){ return super.equals(obj);}
但是如果覆盖了equals()方法的话,则必须要覆盖hashCode()方法。否则FINDBUGS会出现下面的7号BUG:覆盖了equals()方法的话,则必须要覆盖hashCode()方法
所以 public boolean equals(Object obj){ return super.equals(obj);}
public int hashCode(){
return super.hashCode();
}

[color=red]此处,借鉴国外的资料:

findbugs: Class doesn't override equals in superclass
This class extends a class that defines an equals method and adds fields, but doesn't define an equals method itself. Thus, equality on instances of this class will ignore the identity of the subclass and the added fields. Be sure this is what is intended, and that you don't need to override the equals method. Even if you don't need to override the equals method, consider overriding it anyway to document the fact that the equals method for the subclass just return the result of invoking super.equals(o).

大概翻译下:
这个类继承了一个定义了(重写了)equals方法并且又增加了字段,但是自己没有定义(重写 override)一个equals方法。
因此,这个类判断实例相等时会忽视掉子类的相等和字类的成员变量值。
你如果确定这就是你想要的,你可以不必重写这个equals方法。尽管你不需要重写equals方法,也要考虑一下重写equals方法,可以这样:子类的equals方法只return 调用
super.equals(0)的结果就行了。[/color]

3.Class is Serializable, but doesn't define serialVersionUID

serialVersionUID 用来表明类的不同版本间的兼容性

简单来说,Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地 相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。

当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID,类型为long的变量时,Java序列化机制会根据编译的class自动生成一个 serialVersionUID作序列化版本比较用,这种情况下,只有同一次编译生成的class才会生成相同的serialVersionUID 。

如果我们不希望通过编译来强制划分软件版本,即实现序列化接口的实体能够兼容先前版本,未作更改的类,就需要显式地定义一个名为serialVersionUID,类型为long 的变量,不修改这个变量值的序列化实体都可以相互进行串行化和反串行化。

也就是这个错误 你要定义一个名为 serialVersionUID,类型为long的变量 按照新版Eclipse自动填写规则 就是:
private static final long serialVersionUID = 1L;

4.Class names shouldn't shadow simple name of superclass
基本就是这个类的名字跟超类的名字一样但不在一个包里 所以就改下类名啦

5.Comparison of String parameter using == or !=

原因:当比较两个字符串内容是否相同时,仅当两个字符串在源文件中都是常量时或者是使用intern()来比较才可以用==来比较,否则最好使用对象比较方法equal。附 string比较:

String str1 = "java";

String str2 = "java";

System.out.print(str1==str2);

结果:true(二者都为常量)

String str1 = new String("java");

String str2 = new String("java");

System.out.print(str1==str2);

结果:false(二者为对象)

String str1 = "java";

String str2 = "blog";

String s = str1+str2;

System.out.print(s=="javablog");

结果:false(s不为常量,为对象)

String s1 = "java";
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值