FindBugs反模式
- 格式:docx
- 大小:745.22 KB
- 文档页数:19
Product name产品名称Confidentiality level密级FindBugs帮助文档内部公开Product version产品版本Total 29 pages 共29页V1.0FindBugs帮助文档(软件工程部)Prepared by拟制邓爱平36829Date日期2008-10-16Reviewed by 审核人Date 日期Reviewed by 审核人Date 日期Authorized by批准Date日期Huawei Technologies Co., Ltd.华为技术有限公司All rights reserved版权所有侵权必究文档版本 1.1 (2006-03-01) 华为技术有限公司1-1文档版本 1.1 (2006-03-01) 华为技术有限公司1-2修订记录日期文档版本产品版本描述作者2008-10-16 1.0 初稿邓爱平36829文档版本 1.1 (2006-03-01) 华为技术有限公司1-3目录(Contents)1 目的和范围................................................................................................................................... 1-61.1 目的 .............................................................................................................................................. 1-61.2 范围 .............................................................................................................................................. 1-62 FindBugs使用 .............................................................................................................................. 2-62.1 FindBugs简介................................................................................................................................ 2-62.1.1 FindBugs能解决的问题......................................................................................................... 2-62.1.2 同类产品介绍 ....................................................................................................................... 2-92.2 如何安装FindBugs ........................................................................................................................ 2-92.2.1 图形界面/命令行................................................................................................................... 2-92.2.2 安装Eclipse插件................................................................................................................... 2-92.3 如何使用FindBugs ...................................................................................................................... 2-122.3.1 在图形界面下使用FindBugs(JDK1.5上进行)...................................................................... 2-122.3.2 在命令行下使用FindBugs .................................................................................................. 2-152.3.3 在Eclipse下使用FindBugs .................................................................................................. 2-172.3.4 通过ant任务脚本使用FindBugs .......................................................................................... 2-202.4 FindBugs的高级功能................................................................................................................... 2-222.4.1 规则配置............................................................................................................................. 2-222.4.2 使用过滤器......................................................................................................................... 2-222.4.3 FindBugs的局限性.............................................................................................................. 2-232.4.4 FindBugs推行细则.............................................................................................................. 2-243 常见问题FAQ及其解答............................................................................................................ 3-243.1 在Eclipse下在更改了检查出的错误后,为什么无法实时刷新检查结果 ...................................... 3-243.2 在Eclipse下使用FindBugs时,如何将发现的问题显示在Problems视图中................................. 3-243.3 为什么Eclipse插件加载不成功.................................................................................................... 3-253.4 如何配置FindBugs的通过准则.................................................................................................... 3-253.5 为什么在图形界面下使用FindBugs时,关联不到源代码............................................................ 3-253.6 文档胶片中说到的FindBugs帮助文档在什么地方....................................................................... 3-263.7 到什么地方获取FindBugs相关资料............................................................................................. 3-263.8 对于不修改的Bug,怎么给出原因说明....................................................................................... 3-263.9 Findbugs占用大量内存,而且运行时间很长,应该如何缩短运行时间.................................... 3-27文档版本 1.1 (2006-03-01) 华为技术有限公司1-43.10 每个工程目录下的.fbprefs 文件有何作用................................................................................. 3-273.11 Bug Explorer窗口的export有何功能 .......................................................................................... 3-283.12 如何了解findbugs提供的每个规则的含义 ................................................................................. 3-284 参考引用..................................................................................................................................... 4-28文档版本 1.1 (2006-03-01) 华为技术有限公司1-51 目的和范围1.1 目的FindBugs 是一个代码静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
IDEA插件FindBugs的使⽤详解前⾔Findbugs很多⼈都并不陌⽣,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件。
这个插件可以帮助我们查找隐藏的bug,⽐较重要的功能就是查找潜在的null指针。
在编写代码的过程中,我们可能不会⼀直记得检查空的引⽤,在我们测试时可能很难发现问题,但是应⽤上线之后,⾯对⼤量的⽤户,很多问题就会浮现出来。
所以在编码时,使⽤findbugs检查⼀下很有必要。
安装安装完之后,重启studio,会发现左下⾓会出现findbugs的图标可以分析单个⽂件,包下⾯的所有⽂件,整个module下的⽂件,整个project下的⽂件,右键想要分析的⽂件名/包名/module名/project分析完之后就会出现结果⾯板点击对应的item在右边会定位到具体的代码根据需要可以进⾏更改,其中Correctness这个错误使我们重点关注的对象,这⾥⼤多是空指针的错误,根据提⽰进⾏处理。
附:⼀些常见的错误信息Bad practice 代码中的⼀些坏习惯Class names should start with an upper case letter 主要包括类名的命名,以⼤写字母开头Method names should start with a lower case letter ⽅法名以⼩写字母开头Field names should start with a lower case letter 字段名以⼩写字母开头equals()method does not check for null argument equals()⽅法应该检查⾮空Class defines equals() and uses Object.hashCode() ⼀个类覆写了equals⽅法,没有覆写hashCode⽅法,使⽤了Object对象的hashCode⽅法Method ignores exceptional return value ⽅法忽略返回值的异常信息Equals method should not assume anything about the type of its argument equals(Object o)⽅法不能对参数o的类型做任何的假设。
FindBugs实践1、Bug级别根据Bug可能导致的后果,FindBugs定义了若干Bug级别,主要的级别如下所示:Bad Practice: 不好的实践Correctness: 正确性Experimental Internationalization:Malicious code vulnerability: 存在漏洞的有害代码Multithreaded correctness: 多线程正确性Performance:性能Security:安全Dodgy: 欺骗性代码2、常见Bug以及处理办法a)不需要处理May expose internal representation by incorporating reference to mutable object描述:调用set方法,修改对象属性,被修改的对象属性是一个可变的对象;May expose internal representation by returning reference to mutable object描述:调用get方法,获得对象属性,获得的对象属性是一个可变的对象;b)建议处理Dead store to local variable描述:对一个局部变量赋值,但是这个局部变量可能不会被用到;处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉;Exception is caught when Exception is not thrown描述:调用的方法中不会抛出异常,但是调用方法的时候尝试使用try catch 捕获异常;处理方式:确认此方法的调用会不会导致异常的发生,如果不会抛出异常请去掉try catch,确认方法调用会不会抛出异常关键是对方法调用参数的合法性进行检查,排除调用这个方法时可能抛出异常的参数;Unread field描述:某个对象的属性不会被读取处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉,和Dead store to local variable一样处理,只是这里针对的是不是局部变量;Call to static DateFormat描述:调用静态的DateFormat对象处理方式:DateFormat对象是线程不安全的,建议不要使用静态的DateFormat,但是DateFormat不会被修改的话,也可以不用修改;Class is Serializable, but doesn't define serialVersionUID描述:类是可序列化的,但是没有定义serialVersionUID;处理方式:自动生成serialVersionUID;Field only ever set to null描述:Field一直被设置为null;处理方式:检查相关filed的调用情况,看所有对Field的操作是否都是将Field设置为null;Usage of GetResource may be unsafe if class is extended描述:如果一个类被继承了,使用getResource可能会不安全处理方式:Unsynchronized get method, synchronized set method描述:非同步的get方法,同步的set方法处理方式:修改为一致的情况Unconditional wait描述:无条件的wait处理方式:Switch statement found where one case falls through to the next case描述:switch语句中有case没有使用break;处理方式:增加break;Should be a static inner class描述:应该是静态内部类;处理方式:增加static修饰符使其成为静态内部类;Private method is never called描述:私有方法没有被调用;处理方式:考虑将其注释掉;c)必须处理Method invokes toString() method on a String描述:对String对象调用toString方法;处理方式:确认此局部变量是否会被使用,如果确实不会被用到,请去掉;Inefficient use of keySet iterator instead of entrySet iterator描述:在遍历Collection对象的时候,使用entrySet的性能会比keySet性能高;处理方式:使用迭代器迭代Collection的时候,优先使用entrySet;Load of known null value描述:对已知为null的对象进行一些操作,例如if(ids ==null && ids.length<=0);已知ids为空了,但是还调用ids.length属性,应该将&&修改为||;处理方式:这种情况很多时候都是出现在上面的示例代码中,请检查&&和|| 的使用;Method invokes inefficient Number constructor; use static valueOf instead描述:调用Number对象(Long, Integer, Float)低效的构造方法,使用静态的valueOf方法;处理方式:在将一个String对象转化为对应的Number对象的时候,通常会使用new Long(stringObj);实际上使用Long.valueOf(stringObj)会更好;Null pointer dereference描述:对已知为null的对象进行一些操作,例如if(ids ==null && ids.length<=0);已知ids为空了,但是还调用ids.length属性,应该将&&修改为||;处理方式:这种情况很多时候都是出现在上面的示例代码中,请检查&&和|| 的使用;和Load of known null value相伴出现,处理方式一样;Equals method should not assume anything about the type of its argument描述:Equals方法不应该对类型作任何假设;处理方式:通常在调用Class.isInstance去判断对象的相等性的时候会出现;Field isn't final but should be描述:某些字段应该是final的,但是不是;处理方式:public static String LOCAL_CACHE_PROPERTY_NAME = "cache.clustering.local.class"; 通常会出现在静态常量的定义中;Write to static field from instance method描述:在实例方法中修改静态属性;处理方式:避免在实例方法中对静态变量做修改;Unused field描述:未被用到的字段;处理方式:去掉如果确实没有用到;Nullcheck of value previously dereferenced描述:先前已经进行过空值检查了;处理方式:在这里不需要进行空置检查;Method uses the same code for two branches描述:if else 两个分支执行同样的代码;处理方式:检查代码是否正确,如果是正确的,就不需要if else了;Method might ignore exception描述:方法可能忽略异常处理方式:对异常的处理作出检查,这样的情况通常出现在如下代码:Try{ }catch(Exception r){ }。
【⼯利其器】必会⼯具之(五)FindBugs篇——让⼯具找出你代码中的bug 前⾔转载请声明,转⾃【】,谢谢!项⽬中代码质量,往往需要⽐较有经验的程序员的审查来保证。
但是随着项⽬越来越⼤,代码审查会变得越来越复杂,需要耗费越来越多的⼈⼒。
⽽且程序员的经验和精⼒都是有限的,能审查出问题必定有限。
⽽在对代码质量要求越来越严格的当今IT界,这⽆疑是个⽭盾点。
幸运的是,不少公司发布了代码扫描⼯具,来检测代码中存在的问题。
尽管它们⽆法扫描出所有的bug,但仍然能够为我们的⼯作带来极⼤的便利。
其中FindBugs就是这其中的佼佼者,本⽂将结合Android Studio 来介绍该⼯具的使⽤。
⼀、FindBugs简介FindBugs是⼀款Java缺陷检测⼯具,它通过分析静态字节码可以查找出200多种错误模式,例如空指针取消引⽤、⽆限递归循环、Java库的错误使⽤和死锁等。
⼆、安装FindBugs插件Android Studio默认是没有安装FindBugs插件的,需要我们⾃⼰进⾏安装。
所幸Android Studio提供了丰富的插件,可以直接从库插件库中进⾏安装。
当然也可以⾃⼰⼿动从⽹上下载好该插件,然后安装。
这⾥将两种⽅法都简单介绍⼀下。
1、从Android Studio插件库中安装点击⾯板中主菜单Files > Settings > Plugs 就可以进⼊到插件中⼼,如下图所⽰:②处可以输⼊要查找的插件名,如果安装了,并满⾜③处筛选条件,会显⽰在④处列表中。
③处选择筛选范围,④处⽤于显⽰在②处和③处所指定条件下查询到的插件列表,右边的选择框可选中表⽰该插件可以⽤,否则表⽰不可⽤。
⑤处显⽰选择的插件的相关信息⑥处是⼀个⼊⼝,可以跳转去安装JetBrains提供的插件。
⑦处⽤于跳转到从仓库中浏览并安装插件。
⑧处⽤于安转下载到本地的插件。
这⾥我们选择从“Browse Repositories”进⼊安装,进⼊后搜索“FindBugs”会显⽰如下界⾯,我们选择“FindBugs-IDEA”进⾏安装。
Eclipse 插件FindBugs 使用手册前言:本文介绍如何利用Eclipse 插件FindBugs 优化Java 代码。
本插件是本人在对系统进行代码优化的时候,向迟焕祺同事索取并学习使用的,现在把工具的一些使用方法与大家共享,并把FindBugs提供给大家!感谢迟哥提供良好资源供大家学习、使用!问题提出:当我们编写完代码,做完单元测试等各种测试后就提交正式运行,只能由运行的系统来检测我们代码是否有问题了,代码中隐藏的错误在系统运行的过程中被发现后,然后再来进行相应的修改,那么后期修改的代价就相当高了。
解决方法:现在有很多Java 代码分析工具,FindBugs 中开源项目当中的一个,它可以帮你找到代码中隐藏的一些错误,提升你的代码能力与系统安全可靠性。
FindBugs 介绍FindBugs 是一个可以在Java 程序中发现Bugs 的程序。
它是专门用来寻找处于“Bug Patterns”列表中的代码的。
Bug Patterns 指很有可能是错误的代码的实例。
原文:FindBugs is a program to find bugs in Java programs. It looks for instances of "bug patterns" --- code instances that are likely to be errors.使用FindBugs 至少需要JDK1.4.0 以上版本,FindBugs是平台独立的,可以运行于GNU/Linux、Windows、MacOS X 等平台上。
运行FindBugs 至少需要有256 MB 内存,如果你要分析一个很大的项目,那就需要更加多的内存了。
获取FindBugs 最新版本:/projects/findbugs/files/FinBugs 介绍:/manual/Eclipse 插件links 文件夹方式配置:提示:直接的插件配置方式是使用Eclipse 的Update 方式更新,或者把新下载的插件PlugIn 放在原始的Eclipse 目录下去,这种方式会随着插件的增多而导致插件维护工作量的增加。
1.1跟我学Java代码质量检测FindBugs工具——如何下载和安装FindBugs 检测工具1.1.1应用代码检测工具的必要性1、应用代码检测工具的必要性随着软件工程项目越来越复杂和技术应用的不断深入,软件工程项目将变得越来越庞大。
此时,如果仅仅依靠人工去检查软件项目中的程序代码内所可能存在的各种潜在问题是不现实的,即使实施单元测试过程,也是无法完全覆盖和及时地发现出相关的问题,因此借助自动化的程序代码质量检测工具去完成对代码的检查工作是十分必要的。
提高软件系统中的程序代码质量不仅仅要求开发人员遵守一定的编程规范,也还要能够通过各种手段和工具及时地发现出隐藏在软件系统程序代码中的各种错误,而依赖人工在很多场合下都是比较难发现出这些问题或者错误的。
因此,开发人员有必要借助一定的检测工具提高对系统代码检测的效率。
目前在J2EE的开源领域中,针对Eclipse IDE开发工具提供有许多Eclipse 插件,能够帮助开发人员在“编码标准”、“代码重复度”、“代码覆盖率”和“包之间的依赖性”等方面进行具体的度量和检测。
2、FindBugs 是一个静态分析工具FindBugs 是由马里兰大学提供的一款开源Java静态代码分析工具,它检查类或者JAR 文件,将字节码(FindBugs其实就是对编译后的class文件进行扫描,藉以发现一些隐藏的Bug)与一组缺陷模式进行对比以发现可能的问题。
开发人员一旦有了静态分析工具,就可以在不实际运行程序的情况下对所编写的程序代码进行分析和检测,随时发现出相关的问题,从而提高程序代码的质量。
FindBugs检测工具可以发现出的问题主要包括:多线程竞争问题、性能问题、安全问题、代码规范等等。
如下示图为FindBugs检测工具的官方网站页面中的“问题”描述信息页面,读者可以点击相关的“问题”了解详细的说明。
虽然在“问题”描述页面中提供有相关的说明信息,但由于说明信息都一般比较和简短,而且没有对应的Demo代码,理解比较费劲。
Findbugs使用说明目的Findbugs是一个代码质量工具;我们用它来检查源代码中出现的伪问题,以期尽可能在项目的初始阶段将代码问题解决。
本文主要介绍Findbugs的eclipse 插件的应用。
对应的版本是:Findbugs (0.0.16);eclipse (3.1)概要FindBugs 是一个静态分析工具,它检查类或者JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。
我们利用它在eclipse中的插件来对它所过滤的工程的源代码进行检查。
希望在程序员编写代码的过程中,将代码中的缺陷指出来,让编码人员在开发中将它们纠正。
达到尽可能在项目编码中将问题解决得目的。
而不是在编码结束的时候才用该软件对代码检查,修改。
Findbugs使用说明Findbugs的下载地址见参考资料.安装好Findbugs后我们启动eclipse。
在eclipse中选择某个工程的属性。
如下图所示:点击属性弹出属性对话框,我们选择对话框左边的树上的“Findbugs”节点:下面我们对Findbugs各项属性的配置进行一下说明:Run Findbugs automnaticaly:编译工程和文件的时候自动运行Minimum priority to report:根据bug的优先权级别报告bug。
Enable bug categories: bug种类。
✧Correctness:正确性。
✧Performance:性能。
✧Internationalization:国际化。
✧Mutithreaded correctness:多线程的正确性。
✧Style:样式。
✧Malicious code vulnerability :恶意代码。
Select bug patterns to check for:bug的校验模式Bug的校验模式的设置是确定哪一类问题我们应该作为bug报告给用户;详细的bug减少可以参考参考资料。
当我们根据部门规范选择要校验的模式后。
Findbugs如何使⽤?Findbugs的使⽤说明Findbugs使⽤说明1 ⽤途FindBugs 是⼀个java bytecode静态分析⼯具,它可以帮助java⼯程师提⾼代码质量以及排除隐含的缺陷。
FindBugs检查类或者 JAR ⽂件,将字节码与⼀组缺陷模式进⾏对⽐以发现可能的问题。
有了静态分析⼯具,就可以在不实际运⾏程序的情况对软件进⾏分析。
FindBugs不是通过分析类⽂件的形式或结构来确定程序的意图,⽽是通常使⽤ Visitor 模式进⾏分析(Visitor 模式的更多信息)。
2 安装⽬前findbugs最新的版本是1.3.9,2.1 Eclipse插件的安装环境要求,Findbugs要求Eclipse 3.4 以上的版本,JRE/JDK 1.5.0以上的版本。
步骤,将edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821.zip解压到Eclipse的 "plugins"⼦⽬录下,这样就可以在 <eclipse_install_dir>/plugins/edu.umd.cs.findbugs.plugin.eclipse_1.3.9.20090821/下看到FindBugs logo图⽚findbugs.png。
启动Eclipse 然后选择 Help → About Eclipse Platform → Plug-in Details,你应该找到 "FindBugs Plug-in"。
3 使⽤启动选中java⼯程,点击⿏标右键,选择名为“Find Bugs”的菜单,FindBugs开始运⾏,问题指⽰器将指向根据bug模式识别出来的潜在问题代码位置。
可选项定制你还可以通过java⼯程的属性对话框来定制findbugs的运⾏⽅式,可选项包括:控制"Run FindBugs Automatically" 开关的checkbox。
FindBugs反模式制定者:cantellow使用方法:复制你的Patternid,然后查找,即可快速定位。
如有疑问,请当面询问,也可以发邮件:kakashixuze@我的博客:所有的解释和解决方式只是可能和建议,大多数时候需要根据实际情况而定。
Bug: Call to equals() comparing different typesPatternid:EC_UNRELATED_TYPES, type: EC, category: CORRECTNESS解释:两个不同类型的对象调用equals方法,如果equals方法没有被重写,那么调用object的==,永远不会相等;如果equals方法被重写,而且含有instanceof逻辑,那么还是不会相等。
解决方法:应该改为str.toString()Bug: Check for oddness that won't work for negative numbersPatternid:IM_BAD_CHECK_FOR_ODD, type: IM, category: STYLE解释:如果row是负奇数,那么row % 2 == -1,解决方法:考虑使用x & 1 == 1或者x % 2 != 0Bug:RsInterface defines compareTo(Object) and uses Object.equals()Patternid:EQ_COMPARETO_USE_OBJECT_EQUALS, type:Eq, category:BAD_PRACTICE解释:hashcode方法。
Bug:Field PDHSubCardInstanceDialogCommand.m_instance masks field in superclass ViewNEProperityPatternid:MF_CLASS_MASKS_FIELD, type: MF, category: CORRECTNESS解释:这是什么意思呢?想要字段也能够具有多态性吗?太迷惑了。
当你想要更新一个m_instance时,你要更新哪个?你用到它时,你知道哪个又被更新了?解决方法:要么去掉其中一个字段,要么重新命名。
Bug: The class name crossConnectIndexCollecter doesn't start with an upper case letter解释:Patternid:NM_CLASS_NAMING_CONVENTION, type: Nm, category:BAD_PRACTICE看到这样的命名方式,我第一个反映就是有点晕车!解决方法:类名第一个字符请大写。
Bug: "." used for regular expressionPatternid:RE_POSSIBLE_UNINTENDED_PATTERN, type: RE, category: CORRECTNESS解释:String的split方法传递的参数是正则表达式,正则表达式本身用到的字符需要转义,如:句点符号“.”,美元符号“$”,乘方符号“^”,大括号“{}”,方括号“[]”,圆括号“()”,竖线“|”,星号“*”,加号“+”,问号“?”等等,这些需要在前面加上“\\”转义符。
解决方法:在前面加上“\\”转义符。
外部类:内部类:……Bug: Ambiguous invocation of either an outer or inherited method JExtendDialog.onOK()…..…..Bug: Bad comparison of nonnegative value with -1Patternid:INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE, type:INT, category: CORRECTNESS解释:FindBugs说,headSize已经确定是一个非负数了,你把它来跟-1比较,是不是有点可笑?我仔细看了一下,貌似作者别有意图,注意到了对headSize的赋值吗?在一个try catch内,heaSize还是很有可能为-1的,那就是在赋值前try中出现了异常,但是感觉有点别扭,异常作为了处理逻辑,当然你肯定会有不同的看法,因为java中的异常是否可以看作是业务逻辑分支之一已经被大师们讨论了很多年了,这里就不深究了。
解决方法:请明确给headSize赋值,如果是有意,请写明注释。
Bug:AlarmSoundManager$SoundProperty defines clone() but doesn't implement Cloneable Patternid:CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE, type:CN, category:BAD_PRACTICE 解释:SoundProperty类实现了clone方法,但是没有实现Cloneable接口,当然这没有任何问题,Bug: Call to method of static java.text.DateFormatPatternid:STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE, type:STCAL, category:MT_CORRECTNESS解释:TIME_FORMAT是一个DateFormat静态变量,文档中DateFormat不是线程安全(多个线程访问一个类时,这些线程执行顺序没有统一的调度和约定,如果这个类的行为仍然是正确的,那么这个类就是线程安全的。
考虑vector的实现)的,如果多个线程同时访问,会出现意料不到的情况,详情参见Sun Bug #6231579和Sun Bug #6178997。
因此对于DateFormat、SimpleDateFormat、Calendar类对象不建议定义成静态成员字段使用,同时对它们在多线程环境下的使用请一定要保证同步。
另外,多说一句,java为我们提供了很多的封装手段,比如private关键字、内部类、全限定包名等等,我们要充分利用这些手段封装信息,对外尽量提供最小集。
关于静态变量也是如此,就算是vector这种线程安全的类,在无状态类中也可能存在并发的问题,参见:无状态类在并发环境中绝对安全吗?解决方法:修改类字段为对象字段,然后改为private,同时提供get方法,最后对get方法实现同步机制。
最好连对象字段也去掉,直接在方法里使用,就不存在同步的问题了(不必考虑性能问题,而且DateFormat本身就不必作为对象的字段,我想这也是sun为什么不把它实现为线程安全的了)。
Bug:WindowHandlerManager$MySingleSelectionModel is Serializable; consider declaring a serialVersionUIDPatternid:SE_NO_SERIALVERSIONID, type:SnVI, category:BAD_PRACTICE解释:实现了Serializable接口,却没有实现定义serialVersionUID字段,序列化的时候,我们的对象都保存为硬盘上的一个文件,当通过网络传输或者其他类加载方式还原为一个对象时,serialVersionUID字段会保证这个对象的兼容性,考虑两种情况:1.新软件读取老文件,如果新软件有新的数据定义,那么它们必然会丢失。
2.老软件读取新文件,只要数据是向下兼容的,就没有任何问题。
序列化会把所有与你要序列化对象相关的引用(包括父类,特别是内部类持有对外部类的引用,这里的例子就符合这种情况)都输出到一个文件中,这也是为什么能够使用序列化能进行深拷贝。
这种序列化算法给我们的忠告是,不要把一些你无法确定其基本数据类型的对象引用作为你序列化的字段(比如JFrame),否则序列化后的文件超大,而且会出现意想不到的异常。
解决方法:定义serialVersionUID字段Bug:ToStringComparator implements Comparator but not SerializablePatternid:SE_COMPARATOR_SHOULD_BE_SERIALIZABLE, type: Se, category:BAD_PRACTICE解释:ToStringComparator类实现了Comparator接口却没有实现Serializable接口,因为像TreeMap 这种可序列化数据结构(它实现了Serializable接口)只有当比较器继承了Serializable接口时,它才能被序列化。
解决方法:实现Serializable接口并定义serialVersionUID字段Bug: Comparison of String objects using == or !=Patternid:ES_COMPARING_STRINGS_WITH_EQ, type:ES, category:BAD_PRACTICE解释:你确定你已经了解string的全部了?如果你不了解,请参考FX大神的博文:请别再拿“String s = new String("xyz");创建了多少个String实例”来面试了吧那么,接下来我就开始剥皮了:Object和StringBuilder的toString方法都是返回一个new String(),跟””不相等。
如果你之前是这样的定义的:String name = “”;OK,它们处于同一个class常量池,跟””相等。
如果在这之前,你使用了String.Intern方法,你是高手,跟””相等。
如果你没有意识到这些问题,却仍然使用==和!=去比较字符串,那么请不要告诉我是你手滑了= =!解决方法:老实使用equals方法吧,至少为了保持代码的清晰性。
Bug: Comparison of String parameter using == or !=Patternid:ES_COMPARING_PARAMETER_STRING_WITH_EQ, type:ES, category:BAD_PRACTICE解释:跟前面的例子差不多,你如果不能确保propertyName来源于常量池,那么用==比较没有一点意义,难不成你告诉我这能提高性能?如果有功夫为这点性能担惊受怕,还不如花点时间去找找性能瓶颈。
解决方法:使用equals方法Bug: Computation of average could overflowBug: new AsyncCentral() invokes AsyncCentral$FireThread.start()Patternid:SC_START_IN_CTOR, type: SC, category:MT_CORRECTNESS解释:构造方法里重启新的线程,我还是第一次见过这样写的。