真是杯具熊,Y410P手贱把刷EC失败,必须换带程序的EC了吗

299元买个两不耽误! 带U盘的流云EC-S1充电宝真体验_产品_电脑爱好者
299元买个两不耽误! 带U盘的流云EC-S1充电宝真体验
电脑爱好者
15:26 标签:
最让智能手机尴尬的场景是什么?没错,就是拍着拍着照片提示存储空间不够用了;等着电话却提示电量低了。经常遇到这两个情况的童鞋请举手~
为了预防上述问题,我们通常会给手机配备一个OTG U盘用于中转数据,再随身带个充电宝紧急充电。不过,总揣着这么两个小家伙出门还是有点累赘,那么有木有将这两种功能合二为一的存在?
今天智趣狗就为大家带来了一款仅售299元的产品----流云(EleCloud)EC-S1体验。
轻巧的设计
流云EC-S1给小编的第一赶脚就是轻巧。这款产品内置了5000mAh锂聚合物电芯,140mm&62mm&8.9mm的三围和160g的体重在同类产品中属于很轻巧的选手了。将它握在手里的感觉就像拿着iPhone 5,只是比iPhone 5略长略重而已。
这款产品的外观设计不怎么&规矩&。就是故意缺了一个边角,并将电源开关放在了这里,看起来也算是一个个性的点睛之笔吧。
开机激活WiFi之后会有指示灯亮起
输入输出接口和电量指示灯
详细的参数信息
扮演移动电源
流云EC-S1是一款移动电源,支持5V/2.4A的输入(给移动电源自身充电)和输出(给连接的手机充电)。这个指标在移动电源中属于主流水准吧,虽然没有支持QC快充的新款移动电源给力,但也绝不算低。
不过,流云EC-S1随机只配了一根数据线,没有充电器。而我们身边的手机标配充电器则多为5V/2A标准,&喂不饱&这个EC-S2;反之,绝大多数不支持快充技术的手机也仅支持5V/2A的充电,EC-S1也无法发挥全力。
可能有童鞋会说了,可以拿EC-S1给平板电脑充电啊~大号的平板普遍支持5V/2.4A的输入啊~
但你别忘记,这款EC-S1的电池容量只有5000mAh,再减去升压和线路耗损,实际可用的额定电量超不过3500mAh。换句话说,EC-S1最多只能帮配备3000mAh电池的手机充满一次电力。对于电池容量动辄5000mAh起步的平板电脑来说,EC-S1的那点电量又根本不够看。
变身无线U盘
虽然容量不算大,但毕竟移动电源只是EC-S1的副业之一,它主打的功能则是无线U盘。
怎么说呢,它内置有16GB的闪存芯片,在不激活Wi-Fi模块时,使用Micro USB线与电脑相连时可以被识别成一个16GB的U盘,至于传输速度则是USB2.0的平均水平。如果你激活了EC-S1的无线模块,再插在电脑的USB口上就变成给EC-S1充电了,所以这一点需要留意哦~
放在这里的文件无法被APP识别
只有放在指定文件夹的文件才能被顺利识别
长按EC-S1身上的电源键就会激活Wi-Fi模块,此时它会变身一个无线路由器,自动建立一个以&EleCloud&开头的无线热点。
对电脑用户而言,只要在接入这个Wi-Fi热点,并在浏览器中输入http://8.8.8.8就能无线访问EC-S1里面的文件,可以直接播放U盘里的各种影音文件,包括1080P的视频。
手机也是一样,只是流云单独给手机开发了一个APP,安装之后可以更直观地浏览和管理EC-S2里面的文件。比如,APP可以查看EC-S1当前的剩余电量,根据手机电池信息,计算出能帮手机充电到多少的数值。
在使用过程中小编发现了一些问题。比如,图片和影音文件无需下载到手机本地,手机可以直接通过Wi-Fi浏览EC-S2里的上述资源。但是,碰到码率较高的1080P视频,则会卡在等待播放的黑屏界面,稍后就会自动退出,而码率较低的视频无线播放起来则没有问题,拖动进度条快进快退也算流畅,没有太过明显的延迟感。
遇到高码率的1080P视频就无法播放了
普通视频无线播放无压力
此外,手机无法无线浏览EC-S1里面的文档(比如word文件),需要先下载到手机本地才能正常打开。还有一个稍显无语的问题,就是我们需要将音乐、视频、文档、图片分门别类地放在EC-S1指定的文件夹里,才能被手机上的APP识别出来。
分类浏览看不到非指定文件夹内的文件
如果你想用手机查看保存在其他路径的文件,就得通过手机浏览器访问http://8.8.8.8,然后再通过文件管理的窗口查看,在体验上没有APP来得直观和方便。
通过浏览器的文件管理才能看到所有文件
实惠掩瑕疵
总的来看,流云EC-S1的功能还是比较完善的,当手机空间不够时,可以通过无线将手机本地文件上传到EC-S1里面,从而帮手机减负。电影爱好者可以直接将视频拷贝到EC-S1,然后再通过手机无线播放,同样无需担心浪费手机空间。当手机快没电时,拿EC-S1扮演移动电源的赶脚也不错。
只是需要注意的是,手机想无线访问流云EC-S1时必须要先连接到它生成的Wi-Fi热点下,连接成功后的手机实际上是出于断网状态的,期间你将无法使用数据流量上网,意味着将收不到微信消息哦。
总之,虽然流云EC-S2的电池容量不大、存储空间不大、APP也不够完善,但架不住它的价格低,不足三百元的开销足以弥补一些功能和配置上的缺陷了,不是吗? 更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
举报视频:
举报原因(必填):
请说明举报原因(300字以内):
请输入您的反馈
举报理由需要输入300字以内
感谢您的反馈~
请勿重复举报~
请刷新重试~
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
沃尔沃 EC380D挖掘机视频
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
沃尔沃 EC380D挖掘机视频">沃尔沃 EC380D挖掘机视频
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
后才可以领取积分哦~
每观看视频30分钟
+{{data.viewScore}}分
{{data.viewCount}}/3
{{if data.viewCount && data.viewCount != "0" && data.viewCount != "1" && data.viewCount != "2" }}
访问泡泡首页
+{{data.rewardScore}}分
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}1{{else}}0{{/if}}/1
{{if data.rewardCount && data.rewardCount != 0 && data.getRewardDayCount != 0}}
+{{data.signScore}}分
{{data.signCount}}/1
{{if data.signCount && data.signCount != 0}}
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制正在初始化报价器y410p联想笔记本大家觉得怎么样?不归路_8733y410p联想笔记本我觉得还是很不错的。作为一款很经典的商务笔记本,14英寸的外观,有银色和黑色两个色系,很时尚。而且在性能上也蛮强大的,i5的处理器,运行也是非常快速的。
更多回答宝林商场您好,y410p联想笔记本虽然是上一代产品,但是整体性价比优秀。它的特征一般为移动性强、电池续航时间长;时尚型外观特异也有适合商务使用的时尚型笔记本电脑,希望可以帮助到您哦。
津川鞭拔y410p联想笔记本挺好的,整体性能很好,特别那双显卡,i5处理器或多或少拖了后腿,还有红色的背光键盘,很漂亮。14英寸显示屏显示效果还行,联想笔记本的音效非常棒,Windows 8系统在加装了一根4G内存条以后,毫无压力。
希望我的回答能帮到你。
热门问答123456789101112131415161718192021222324252627282930全球最新的免费资源发布区
Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
& 日 18:31 &
部落已经在前几天介绍了Windows Azure免费云空间,该空间应该被称为真正意义上的全能空间,它既是免费ASP空间,也是免费PHP空间,支持Java等多种语言,最给力的就是Windows Azure提供免费Windows和Linux操作系统VPS主机。
支持绑定域名,有强大的主机监控和管理功能,如果Windows Azure不是免费三个月的话,它绝对是史上最好的免费空间,申请过程唯一的难点就是要用信用卡通过认证。部分朋友反映说Windows Azure使用财付通的美国运通卡老是提示失败。
根据分析,部分朋友成功用财付通运通卡成功申请到了Windows Azure,而有的人又不能使用,原因可能有三:一是微软发现自从部落“带头”用了财付通运通卡成功通过了Windows Azure越来越多的人效仿,这人一多微软自然开始有小“动作”了。
二是有人即便申请成功了Windows Azure也发现创建VPS主机时出现Disabled,成功创建的订单也被取消掉了,原因可能是微软确实对来自国内的用户“下手”了,至于微软如何判断出来的,方法有很多,这对于微软不是难题。
三是就是关于滥用的问题。目前微软并没有完全拒绝中国用户的申请和使用,例如部落创建的虚拟主机、VPS主机的现在依然可以正常使用。但是由于申请和使用人太多则有可能是被怀疑“滥用”,部分正规的用户则有可能是不幸“中枪”了。
今天部落将再次为大家介绍如何成功申请到来自亚马逊的免费一年的VPS主机服务。亚马逊公司这个就不用介绍了,是美国最大的一家网络电子商务公司,亚马逊弹性计算云Amazon EC2更是鼎鼎有名。
之前部落介绍的、都是用的亚马逊云服务的,这里还有免费VPS可以申请使用的:
1、微软全能VPS:
2、台湾VPS主机:
3、德国VPS主机:
Amazon AWS亚马逊云服务免费一年VPS主机成功申请和使用方法
PS:日更新,请使用Amazon EC2的朋友一定要看一下防止被扣费的经验文章:
PS:日更新,感谢“张杉”热心朋友的提醒:
1、如果你的Amazon AWS开通后却连接不上,可能是主机的问题,重新多开几个总有一个能连上。目前没发现扣费。
2、安装的时候一定要密钥,否则你翻遍了也获取不到登录密码,不可以再次添加密钥的。安装的时候最好选择快速安装,新手们就别自己折腾,省的出错。
至于有不少朋友担心因为自己的信用卡已经绑定了Amazon AWS,一旦超出了Amazon AWS VPS主机的免费配额(当然也有可能是在配置VPS时没有看清勾选了部分付费选项)就会产生费用,部落提供的解决的方法有:
1、自我控制,不要滥用Amazon AWS的免费VPS,Amazon AWS绑定信用卡目的之一其实也是要让大家好好珍惜免费资源。
2、绑定了财付通的美国运通卡,可以关闭无安全码绿色通道。如果你实在不放心,就把余额从财付通中转移出来,目前财付通貌似没有透支功能。
一、Amazon AWS亚马逊云服务申请准备
1、Amazon AWS官网:
1、官方首页:https://aws.amazon.com
2、:https://aws.amazon.com/free
3、VPS管理:https://console.aws.amazon.com/ec2/home
2、Amazon AWS亚马逊免费VPS配置是:
1、内存:613MB内存,基于Xen 32位或64位
2、30GB月流量,其中15G上行流量, 15G下行流量
3、主机空间10GB硬盘,1百万以下I/O读写
4、可以免费使用一年,有Linux和Windows操作系统
3、进入Amazon AWS,注册一个Amazon账号。
4、Amazon AWS申请要求验证信用卡,扣掉1美元验证费,如果你有双币种信用卡自然没有问题。
5、没有信用卡的朋友也没有关系,你可以申请财付通境外支付,经过部落测试用财付通的美国运通卡照样没有问题。
6、这是,注意开通一下美国运通卡的无安全码绿色通道。
二、Amazon AWS亚马逊免费VPS申请过程
1、进入Amazon AWS申请地址,登录你的Amazon AWS账号,然后填写你的财付通的美国运通卡。当然你也可以填写你的双币种信用卡。
2、特别提示:经过部落测试,使用财付通的美国运通卡来通过Amazon AWS的信用卡认证,会被冻结2美元,共冻结两次。第一次是添加信用卡时Amazon AWS验证导致了财付通美元运通卡冻结1美元。
3、第二次是Amazon AWS为了认证信用卡,会在信用卡那里扣掉1美元作为验证费,等到你的服务到期后,这一美元还是会还给你的。至于被冻结的额外一美元,按照财付通美国运通卡结算,30天后会自动返回到财付通账户中。
4、提交后接下来是电话验证,填写你的手机号码。点击下一步,页面上会出现4个数字。
5、这时候你的手机会收到Amazon AWS的电话,等英语说完了,输入你在页面上看到的4个数字,这时Amazon AWS就会提示验证成功了。
6、Amazon AWS亚马逊云服务免费VPS开通大概要几分钟,不过部分大概等了1个小时左右才可以正常使用。
三、Amazon AWS亚马逊免费VPS创建方法
1、上面我们已经成功申请到了Amazon AWS亚马逊免费VPS,接下来我们就要定制我们的免费VPS主机了。
2、进入Amazon AWS亚马逊VPS主机的管理页面,点击“创建应用”。(点击放大)
3、接下来是选择VPS的创建方式,你经典的、快速的和自定义。区别主要是VPS主机具体定制。
4、下一步是选择一个操作系统,Ubuntu、Windows、Fedora等都是可以选择的。Windows系统可能还有额外的费用。
5、然后确定你的Amazon AWS主机的配置情况,直接默认就行了。(点击放大)
6、为你的Amazon AWS VPS主机设置一个密钥名称。
7、点击下一下,选择新建一个Key Pair,输入名称,点击下载,就能将你的VPS主机的密钥下载到本地了。
8、最后选择一个VPS主机的防火墙策略。
9、点击确定后,最后显示的是你的VPS主机的详细配置信息,没有错误的话,点击创建即完成VPS主机的创建了。
四、Amazon AWS亚马逊免费VPS管理教程
1、首先下载导入你从邮件中下载的私钥,然后保存PPK私钥到本地。
2、打开你的,主机名称是Amazon AWS VPS主机的Public DNS。
3、在SSH授权中添加你刚刚保存在本地的PPK密钥。
4、最后点击打开输入root或者Ubuntu就能登录你的VPS主机了。
5、具体的Linux管理或者Windows管理大家可以直接在Putty或者使用Windows远程连接来管理了。
6、当然Amazon AWS 的VPS主机管理面板也提供了强大的在经管理功能,你只要右击该VPS就出现的管理面板了。
五、Amazon AWS亚马逊免费VPS演示
1、简单地测试了一下Amazon AWS的免费VPS网络下载速度,达到了20MB/s以上,而磁盘读取速度在5MB/s左右。
2、VPS主机相关演示:
1、页演示:ec2-67-202-16-155.compute-1.amazonaws.com
2、IP地址:10.208.114.142
六、Amazon AWS亚马逊云服务使用小结
1、财付通美国运通卡支持直接扣款消费而不需要安全验证码,所以大家在使用Amazon AWS要特别注意控制好资源,一旦超过了Amazon AWS免费VPS主机的使用限额,就有可能从你的财付通中扣除相关的费用。
2、Amazon AWS的使用时长是一年,主机配置自然是非常不错的,大家在选择Amazon AWS VPS时注意有些服务会产生收费,请仔细看清说明,否则一不小心则可能对你的信用卡或者美国运通卡收费了。
文章出自:
版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。
您或许对下面这些文章有兴趣:&&&&&&&&&&&&&&&&&&&&本月吐槽辛苦排行榜
免费资源部落博主
经常混迹于各种免费资源中,尝鲜后乐于分享给他人。用WP搭建了部落博客,没事儿就折腾Wordpress,喜欢找免费空间,但只求精,稳定,耐用。有时也会介绍一点关于建站的知识和主机、服务器的使用心得与体会。
TA的专栏:&&|&&
关于本文的作者
所属分类:
链接地址:
浏览前页:
浏览后页:
部落快速搜索栏
各类专题梳理
网站导航栏
免费资源重点推荐
最新文章推荐
部落最新评论列表
部落本月最受关注的热点
(热度2℃) (热度1℃) (热度1℃) (热度1℃)
部落本月踩得最多的宝贝
(踩1,889次) (踩1,710次) (踩1,510次) (踩934次) (踩723次) (踩697次) (踩576次) (踩545次) (踩539次) (踩463次)
免费资源部落,是一个致力发布和推广来自世界各地的免费资源,包括多样实用的免费空间、各种优秀的免费软件、各样可用的免费网盘等个人博客网站。站长qi是一位很普通不过的人,长期关注网络空间、互联网、软件应用、程序开发与设计、网络应用等。免费资源部落成立的目的就是希望与更多人分享网络快乐与精彩!本站持续修改完善中,如遇不便还请谅解^_^ &&目标赋予我们生命的意义和目的。有了目标,我们才会把注意力集中在追求喜悦,而不是在避免痛苦上。...
FindBugs规则整理
FindBugs是基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等
一、Security 关于代码安全性防护
1.Dm: Hardcoded constant database password (DMI_CONSTANT_DB_PASSWORD)
代码中创建DB的密码时采用了写死的密码。
2.Dm: Empty database password (DMI_EMPTY_DB_PASSWORD)
创建数据库连接时没有为数据库设置密码,这会使数据库没有必要的保护。
3.HRS: HTTP cookie formed from untrusted input (HRS_REQUEST_PARAMETER_TO_COOKIE)
此代码使用不受信任的HTTP参数构造一个HTTP Cookie。
4.HRS: HTTP Response splitting vulnerability (HRS_REQUEST_PARAMETER_TO_HTTP_HEADER)
在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。
5.SQL: Nonconstant string passed to execute method on an SQL statement (SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)
该方法以字符串的形式来调用SQLstatement的execute方法,它似乎是动态生成SQL语句的方法。这会更容易受到SQL注入攻击。
6.XSS: JSP reflected cross site scripting vulnerability (XSS_REQUEST_PARAMETER_TO_JSP_WRITER)
在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。
二、Experimental
1.LG: Potential lost logger changes due to weak reference in OpenJDK (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)
OpenJDK的引入了一种潜在的不兼容问题,特别是,java.util.logging.Logger的行为改变时。它现在使用内部弱引用,而不是强引用。–logger配置改变,它就是丢失对logger的引用,这本是一个合理的变化,但不幸的是一些代码对旧的行为有依赖关系。这意味着,当进行垃圾收集时对logger配置将会丢失。例如:
public static void initLogging() throws Exception {
Logger logger = Logger.getLogger("edu.umd.cs");
logger.addHandler(new FileHandler()); // call to change logger configuration
logger.setUseParentHandlers(false); // another call to change logger configuration
该方法结束时logger的引用就丢失了,如果你刚刚结束调用initLogging方法后进行垃圾回收,logger的配置将会丢失(因为只有保持记录器弱引用)。
public static void main(String[] args) throws Exception {
initLogging(); // adds a file handler to the logger
System.gc(); // logger configuration lost
Logger.getLogger("edu.umd.cs").info("Some message"); // this isn't logged to the file as expected
2.OBL: Method may fail to clean up stream or resource (OBL_UNSATISFIED_OBLIGATION)
这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动。
一般来说,如果一个方法打开一个流或其他资源,该方法应该使用try / finally块来确保在方法返回之前流或资源已经被清除了。这种错误模式基本上和OS_OPEN_STREAM和ODR_OPEN_DATABASE_RESOURCE错误模式相同,但是是在不同在静态分析技术。我们正为这个错误模式的效用收集反馈意见。
三、Bad practice代码实现中的一些坏习惯
1.AM: Creates an empty jar file entry (AM_CREATES_EMPTY_JAR_FILE_ENTRY)
调用putNextEntry()方法写入新的 jar 文件条目时立即调用closeEntry()方法。这样会造成JarFile条目为空。
2.AM: Creates an empty zip file entry (AM_CREATES_EMPTY_ZIP_FILE_ENTRY)
调用putNextEntry()方法写入新的 zip 文件条目时立即调用closeEntry()方法。这样会造成ZipFile条目为空。
3.BC: Equals method should not assume anything about the type of its argument (BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)
equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的类型的对象时,结果才为 true。
4.BC: Random object created and used only once (DMI_RANDOM_USED_ONLY_ONCE)
随机创建对象只使用过一次就抛弃
5.BIT: Check for sign of bitwise operation (BIT_SIGNED_CHECK)
检查位操作符运行是否合理
((event.detail & SWT.SELECTED) & 0)
If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '& 0'.
6.CN: Class implements Cloneable but does not define or use clone method (CN_IDIOM)
按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的),以获得有关重写此方法的详细信息。此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的,应该实现此接口的类应该使用公共方法重写 Object.clone
7.CN: clone method does not call super.clone() (CN_IDIOM_NO_SUPER_CALL)
一个非final类型的类定义了clone()方法而没有调用super.clone()方法。例如:B扩展自A,如果B中clone方法调用了spuer.clone(),而A中的clone没有调用spuer.clone(),就会造成结果类型不准确。要求A的clone方法中调用spuer.clone()方法。
8.CN: Class defines clone() but doesn't implement Cloneable (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)
类中定义了clone方法但是它没有实现Cloneable接口
9.Co: Abstract class defines covariant compareTo() method (CO_ABSTRACT_SELF)
抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型,如下例:
int compareTo(T o)
比较此对象与指定对象的顺序。
10.Co: Covariant compareTo() method defined (CO_SELF_NO_OBJECT)
类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型
11.DE: Method might drop exception (DE_MIGHT_DROP)
方法可能抛出异常
12.DE: Method might ignore exception (DE_MIGHT_IGNORE)
方法可能忽略异常
13.DMI: Don't use removeAll to clear a collection (DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)
不要用removeAll方法去clear一个集合
14.DP: Classloaders should only be created inside doPrivileged block (DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)
类加载器只能建立在特殊的方法体内
15.Dm: Method invokes System.exit(...) (DM_EXIT)
在方法中调用System.exit(...)语句,考虑用RuntimeException来代替
16.Dm: Method invokes dangerous method runFinalizersOnExit (DM_RUN_FINALIZERS_ON_EXIT)
在方法中调用了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法,因为这样做是很危险的。
17.ES: Comparison of String parameter using == or != (ES_COMPARING_PARAMETER_STRING_WITH_EQ)
用==或者!=方法去比较String类型的参数
18.ES: Comparison of String objects using == or != (ES_COMPARING_STRINGS_WITH_EQ)
用==或者!=去比较String类型的对象
19.Eq: Abstract class defines covariant equals() method (EQ_ABSTRACT_SELF)
20.Eq: Equals checks for noncompatible operand (EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)
equals方法检查不一致的操作。两个类根本就是父子关系而去调用equals方法去判读对象是否相等。
public boolean equals(Object o) {
if (o instanceof Foo)
return name.equals(((Foo)o).name);
else if (o instanceof String)
return name.equals(o);
21.Eq: Class defines compareTo(...) and uses Object.equals() (EQ_COMPARETO_USE_OBJECT_EQUALS)
类中定义了compareTo方法但是继承了Object中的compareTo方法
22.Eq: equals method fails for subtypes (EQ_GETCLASS_AND_CLASS_CONSTANT)
类中的equals方法可能被子类中的方法所破坏,当使用类似于Foo.class == o.getClass()的判断时考虑用this.getClass() == o.getClass()来替换
23.Eq: Covariant equals() method defined (EQ_SELF_NO_OBJECT)
类中定义了多个equals方法。正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。
24.FI: Empty finalizer should be deleted (FI_EMPTY)
为空的finalizer方法应该删除。一下关于finalizer的内容省略
25.GC: Unchecked type in generic call (GC_UNCHECKED_TYPE_IN_GENERIC_CALL)
This call to a generic collection method passes an argument while compile type Object where a specific type from the generic type parameters is expected. Thus, neither the standard Java type system nor static analysis can provide useful information on whether the object being passed as a parameter is of an appropriate type.
26.HE: Class defines equals() but not hashCode() (HE_EQUALS_NO_HASHCODE)
方法定义了equals方法却没有定义hashCode方法
27.HE: Class defines hashCode() but not equals() (HE_HASHCODE_NO_EQUALS)
类定义了hashCode方法去没有定义equal方法
28.HE: Class defines equals() and uses Object.hashCode() (HE_EQUALS_USE_HASHCODE)
一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法
29.HE: Class inherits equals() and uses Object.hashCode() (HE_INHERITS_EQUALS_USE_HASHCODE)
子类继承了父类的equals方法却使用了Object的hashCode方法
30.IC: Superclass uses subclass during initialization (IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)
子类在父类未初始化之前使用父类对象实例
public class CircularClassInitialization {
static class InnerClassSingleton extends CircularClassInitialization {
static InnerClassSingleton singleton = new InnerClassSingleton();
static CircularClassInitialization foo = InnerClassSingleton.
31.IMSE: Dubious catching of IllegalMonitorStateException (IMSE_DONT_CATCH_IMSE)
捕捉违法的监控状态异常,例如当没有获取到对象锁时使用其wait和notify方法
32.ISC: Needless instantiation of class that only supplies static methods (ISC_INSTANTIATE_STATIC_CLASS)
为使用静态方法而创建一个实例对象。调用静态方法时只需要使用类名+静态方法名就可以了。
33.It: Iterator next() method can't throw NoSuchElementException (IT_NO_SUCH_ELEMENT)
迭代器的next方法不能够抛出NoSuchElementException
34.J2EE: Store of non serializable object into HttpSession (J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)
在HttpSession对象中保存非连续的对象
35.JCIP: Fields of immutable classes should be final (JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)
The class is annotated with net.jcip.annotations.Immutable, and the rules for that annotation require that all fields are final. .
36.NP: Method with Boolean return type returns explicit null (NP_BOOLEAN_RETURN_NULL)
返回值为boolean类型的方法直接返回null,这样会导致空指针异常
37.NP: equals() method does not check for null argument (NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)
变量调用equals方法时没有进行是否为null的判断
38.NP: toString method may return null (NP_TOSTRING_COULD_RETURN_NULL)
toString方法可能返回null
39.Nm: Class names should start with an upper case letter (NM_CLASS_NAMING_CONVENTION)
类的名称以大写字母名称开头
40.Nm: Class is not derived from an Exception, even though it is named as such (NM_CLASS_NOT_EXCEPTION)
类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆
41.Nm: Confusing method names (NM_CONFUSING)
令人迷惑的方面命名
42.Nm: Field names should start with a lower case letter (NM_FIELD_NAMING_CONVENTION)
非final类型的字段需要遵循驼峰命名原则
43.Nm: Use of identifier that is a keyword in later versions of Java (NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)
验证是否是java预留关键字
44.Nm: Use of identifier that is a keyword in later versions of Java (NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)
验证是否时java中的关键字
45.Nm: Method names should start with a lower case letter (NM_METHOD_NAMING_CONVENTION)
方法名称以小写字母开头
46.Nm: Class names shouldn't shadow simple name of implemented interface (NM_SAME_SIMPLE_NAME_AS_INTERFACE)
实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中
47.Nm: Class names shouldn't shadow simple name of superclass (NM_SAME_SIMPLE_NAME_AS_SUPERCLASS)
继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中
48.Nm: Very confusing method names (but perhaps intentional) (NM_VERY_CONFUSING_INTENTIONAL)
很容易混淆的方法命名,例如方法的名称名称使用使用大小写来区别两个不同的方法。
49.Nm: Method doesn't override method in superclass due to wrong package for parameter (NM_WRONG_PACKAGE_INTENTIONAL)
由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法
import alpha.F
public class A {
public int f(Foo x) { return 17; }
import beta.F
public class B extends A {
public int f(Foo x) { return 42; }
public int f(alpha.Foo x) { return 27; }
50.ODR: Method may fail to close database resource (ODR_OPEN_DATABASE_RESOURCE)
方法中可能存在关闭数据连接失败的情况
51.OS: Method may fail to close stream (OS_OPEN_STREAM)
方法中可能存在关闭流失败的情况
52.OS: Method may fail to close stream on exception (OS_OPEN_STREAM_EXCEPTION_PATH)
方法中可能存在关闭流时出现异常情况
53.RC: Suspicious reference comparison to constant (RC_REF_COMPARISON_BAD_PRACTICE)
当两者为不同类型的对象时使用equals方法来比较它们的值是否相等,而不是使用==方法。例如比较的两者为java.lang.Integer, java.lang.Float
54.RC: Suspicious reference comparison of Boolean values (RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN)
使用== 或者 !=操作符来比较两个 Boolean类型的对象,建议使用equals方法。
55.RR: Method ignores results of InputStream.read() (RR_NOT_CHECKED)
InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。
56.RR: Method ignores results of InputStream.skip() (SR_NOT_CHECKED)
InputStream.skip()方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户跳过少量字符请求的情况
57.RV: Method ignores exceptional return value (RV_RETURN_VALUE_IGNORED_BAD_PRACTICE)
方法忽略返回值的异常信息
58.SI: Static initializer creates instance before all static final fields assigned (SI_INSTANCE_BEFORE_FINALS_ASSIGNED)
在所有的static final字段赋值之前去使用静态初始化的方法创建一个类的实例。
59.Se: Non-serializable value stored into instance field of a serializable class (SE_BAD_FIELD_STORE)
非序列化的值保存在声明为序列化的的非序列化字段中
60.Se: Comparator doesn't implement Serializable (SE_COMPARATOR_SHOULD_BE_SERIALIZABLE)
Comparator接口没有实现Serializable接口
61.Se: Serializable inner class (SE_INNER_CLASS)
序列化内部类
62.Se: serialVersionUID isn't final (SE_NONFINAL_SERIALVERSIONID)
关于UID类的检查内容省略
63.Se: Class is Serializable but its superclass doesn't define a void constructor (SE_NO_SUITABLE_CONSTRUCTOR)
子类序列化时父类没有提供一个void的构造函数
64.Se: Class is Externalizable but doesn't define a void constructor (SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)
Externalizable 实例类没有定义一个void类型的构造函数
65.Se: The readResolve method must be declared with a return type of Object. (SE_READ_RESOLVE_MUST_RETURN_OBJECT)
readResolve从流中读取类的一个实例,此方法必须声明返回一个Object类型的对象
66.Se: Transient field that isn't set by deserialization. (SE_TRANSIENT_FIELD_NOT_RESTORED)
This class contains a field that is updated at multiple places in the class, thus it seems to be part of the state of the class. However, since the field is marked as transient and not set in readObject or readResolve, it will contain the default value in any deserialized instance of the class.
67.SnVI: Class is Serializable, but doesn't define serialVersionUID (SE_NO_SERIALVERSIONID)
一个类实现了Serializable接口但是没有定义serialVersionUID类型的变量。序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
68.UI: Usage of GetResource may be unsafe if class is extended (UI_INHERITANCE_UNSAFE_GETRESOURCE)
当一个类被子类继承后不要使用this.getClass().getResource(...)来获取资源
四、Correctness关于代码正确性相关方面的
1.BC: Impossible cast (BC_IMPOSSIBLE_CAST)
不可能的类转换,执行时会抛出ClassCastException
2.BC: Impossible downcast (BC_IMPOSSIBLE_DOWNCAST)
父类在向下进行类型转换时抛出ClassCastException
3.BC: Impossible downcast of toArray() result (BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY)
集合转换为数组元素时发生的类转换错误。
This code is casting the result of calling toArray() on a collection to a type more specific than Object[], as in:
String[] getAsArray(Collection&String& c) {
return (String[]) c.toArray();
This will usually fail by throwing a ClassCastException. The toArray() of almost all collections return an Object[]. They can't really do anything else, since the Collection object has no reference to the declared generic type of the collection.
The correct way to do get an array of a specific type from a collection is to use c.toArray(new String[]); or c.toArray(new String[c.size()]); (the latter is slightly more efficient).
4.BC: instanceof will always return false (BC_IMPOSSIBLE_INSTANCEOF)
采用instaneof方法进行比较时总是返回false。前提是保证它不是由于某些逻辑错误造成的。
5.BIT: Incompatible bit masks (BIT_AND)
错误的使用&位操作符,例如(e & C)
6.BIT: Check to see if ((...) & 0) == 0 (BIT_AND_ZZ)
检查恒等的逻辑错误
7.BIT: Incompatible bit masks (BIT_IOR)
错误的使用|位操作符,例如(e | C)
8.BIT: Check for sign of bitwise operation (BIT_SIGNED_CHECK_HIGH_BIT)
检查逻辑运算符操作返回的标识。例如((event.detail & SWT.SELECTED) & 0),建议采用!=0代替&0
9.BOA: Class overrides a method implemented in super class Adapter wrongly (BOA_BADLY_OVERRIDDEN_ADAPTER)
子类错误的覆写父类中用于适配监听其他事件的方法,从而导致当触发条件发生时不能被监听者调用
10.Bx: Primitive value is unboxed and coerced for ternary operator (BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR)
在三元运算符操作时如果没有对值进行封装或者类型转换。例如:b ? e1 : e2
11.DLS: Dead store of class literal (DLS_DEAD_STORE_OF_CLASS_LITERAL)
以类的字面名称方式为一个字段赋值后再也没有去使用它,在1.4jdk中它会自动调用静态的初始化方法,而在jdk1.5中却不会去执行。
12.DLS: Overwritten increment (DLS_OVERWRITTEN_INCREMENT)
覆写增量增加错误i = i++
13.DMI: Bad constant value for month (DMI_BAD_MONTH)
hashNext方法调用next方法。
14.DMI: Collections should not contain themselves (DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES)
集合没有包含他们自己本身。
15.DMI: Invocation of hashCode on an array (DMI_INVOKING_HASHCODE_ON_ARRAY)
数组直接使用hashCode方法来返回哈希码。
int [] a1 = new int[]{1,2,3,4};
System.out.println(a1.hashCode());
System.out.println(java.util.Arrays.hashCode(a1));
16.DMI: Double.longBitsToDouble invoked on an int (DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT)
17.DMI: Vacuous call to collections (DMI_VACUOUS_SELF_COLLECTION_CALL)
集合的调用不能被感知。例如c.containsAll(c)总是返回true,而c.retainAll(c)的返回值不能被感知。
18.Dm: Can't use reflection to check for presence of annotation without runtime retention (DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION)
Unless an annotation has itself been annotated with @Retention(RetentionPolicy.RUNTIME), the annotation can't be observed using reflection (e.g., by using the isAnnotationPresent method). .
19.Dm: Useless/vacuous call to EasyMock method (DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD)
While ScheduledThreadPoolExecutor inherits from ThreadPoolExecutor, a few of the inherited tuning methods are not useful for it. In particular, because it acts as a fixed-sized pool using corePoolSize threads and an unbounded queue, adjustments to maximumPoolSize have no useful effect.
20.EC: equals() used to compare array and nonarray (EC_ARRAY_AND_NONARRAY)
数组对象使用equals方法和非数组对象进行比较。即使比较的双方都是数组对象也不应该使用equals方法,而应该比较它们的内容是否相等使用java.util.Arrays.equals(Object[], Object[]);
21.EC: equals(...) used to compare incompatible arrays (EC_INCOMPATIBLE_ARRAY_COMPARE)
使用equls方法去比较类型不相同的数组。例如:String[] and StringBuffer[], or String[] and int[]
22.EC: Call to equals() with null argument (EC_NULL_ARG)
调用equals的对象为null
23.EC: Call to equals() comparing unrelated class and interface (EC_UNRELATED_CLASS_AND_INTERFACE)
使用equals方法比较不相关的类和接口
24.EC: Call to equals() comparing different interface types (EC_UNRELATED_INTERFACES)
调用equals方法比较不同类型的接口
25.EC: Call to equals() comparing different types (EC_UNRELATED_TYPES)
调用equals方法比较不同类型的类
26.EC: Using pointer equality to compare different types (EC_UNRELATED_TYPES_USING_POINTER_EQUALITY)
This method uses using pointer equality to compare two references that seem to be of different types. The result of this comparison will always be false at runtime.
27.Eq: equals method always returns false (EQ_ALWAYS_FALSE)
使用equals方法返回值总是false
28.Eq: equals method always returns true (EQ_ALWAYS_TRUE)
equals方法返回值总是true
29.Eq: equals method compares class names rather than class objects (EQ_COMPARING_CLASS_NAMES)
使用equals方法去比较一个类的实例和类的类型
30.Eq: Covariant equals() method defined for enum (EQ_DONT_DEFINE_EQUALS_FOR_ENUM)
This class defines an enumeration, and equality on enumerations are defined using object identity. Defining a covariant equals method for an enumeration value is exceptionally bad practice, since it would likely result in having two different enumeration values that compare as equals using the covariant enum method, and as not equal when compared normally. Don't do it.
31.Eq: equals() method defined that doesn't override equals(Object) (EQ_OTHER_NO_OBJECT)
类中定义的equals方法时不要覆写equals(Object)方法
32.Eq: equals() method defined that doesn't override Object.equals(Object) (EQ_OTHER_USE_OBJECT)
类中定义的equals方法时不要覆写Object中的equals(Object)方法
33.Eq: equals method overrides equals in superclass and may not be symmetric (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC)
34.Eq: Covariant equals() method defined, Object.equals(Object) inherited (EQ_SELF_USE_OBJECT)
类中定义了一组equals方法,但是都是继承的java.lang.Object class中的equals(Object)方法
35.FE: Doomed test for equality to NaN (FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER)
This code checks to see if a floating point value is equal to the special Not A Number value (e.g., if (x == Double.NaN)). However, because of the special semantics of NaN, no value is equal to Nan, including NaN. Thus, x == Double.NaN always evaluates to false. To check to see if a value contained in x is the special Not A Number value, use Double.isNaN(x) (or Float.isNaN(x) if x is floating point precision).
36.FS: Format string placeholder incompatible with passed argument (VA_FORMAT_STRING_BAD_ARGUMENT)
错误使用参数类型来格式化字符串
37.FS: The type of a supplied argument doesn't match format specifier (VA_FORMAT_STRING_BAD_CONVERSION)
指定的格式字符串和参数类型不匹配,例如:String.format("%d", "1")
38.FS: MessageFormat supplied where printf style format expected (VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED)
但用String的format方法时实际调用了MessageFormat中干的格式化方法而引起格式化结果出错。
39.FS: More arguments are passed than are actually used in the format string (VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED)
使用String的format方法时有非法的参数也经过了格式化操作。
40.FS: Illegal format string (VA_FORMAT_STRING_ILLEGAL)
格式化String对象语句错误
41.FS: Format string references missing argument (VA_FORMAT_STRING_MISSING_ARGUMENT)
String的format操作缺少必要的参数。
42.FS: No previous argument for format string (VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT)
格式字符串定义错误,例如:formatter.format("%&s %s", "a", "b"); 抛出MissingFormatArgumentException异常
43.GC: No relationship between generic parameter and method argument (GC_UNRELATED_TYPES)
This call to a generic collection method contains an argument with an incompatible class from that of the collection's parameter (i.e., the type of the argument is neither a supertype nor a subtype of the corresponding generic type argument). Therefore, it is unlikely that the collection contains any objects that are equal to the method argument used here. Most likely, the wrong value is being passed to the method.
In general, instances of two unrelated classes are not equal. For example, if the Foo and Bar classes are not related by subtyping, then an instance of Foo should not be equal to an instance of Bar. Among other issues, doing so will likely result in an equals method that is not symmetrical. For example, if you define the Foo class so that a Foo can be equal to a String, your equals method isn't symmetrical since a String can only be equal to a String.
In rare cases, people do define nonsymmetrical equals methods and still manage to make their code work. Although none of the APIs document or guarantee it, it is typically the case that if you check if a Collection&String& contains a Foo, the equals method of argument (e.g., the equals method of the Foo class) used to perform the equality checks.
44.HE: Signature declares use of unhashable class in hashed construct (HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS)
A method, field or class declares a generic signature where a non-hashable class is used in context where a hashable class is required. A class that declares an equals method but inherits a hashCode() method from Object is unhashable, since it doesn't fulfill the requirement that equal objects have equal hashCodes.
45.HE: Use of class without a hashCode() method in a hashed data structure (HE_USE_OF_UNHASHABLE_CLASS)
A class defines an equals(Object) method but not a hashCode() method, and thus doesn't fulfill the requirement that equal objects have equal hashCodes. An instance of this class is used in a hash data structure, making the need to fix this problem of highest importance.
46.ICAST: integral value cast to double and then passed to Math.ceil (ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL)
integral的值转换为double后使用了Math.ceil方法
47.ICAST: int value cast to float and then passed to Math.round (ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND)
int 类型的值转换为float类型之后调用了Math.round方法
48.IJU: JUnit assertion in run method will not be noticed by JUnit (IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD)
在JUnit中的断言在run方法中不会被告知
49.IJU: TestCase declares a bad suite method (IJU_BAD_SUITE_METHOD)
在一个JUnit类中声明的一个suite()方法必须声明为
public static junit.framework.Test suite()
public static junit.framework.TestSuite suite()的形式。
50.IL: A collection is added to itself (IL_CONTAINER_ADDED_TO_ITSELF)
集合本身作为add方法的参数,这样会引起内容溢出。
51.IL: An apparent infinite loop (IL_INFINITE_LOOP)
方法的自调用引起的死循环
52.IM: Integer multiply of result of integer remainder (IM_MULTIPLYING_RESULT_OF_IREM)
和整数余数进行乘法运算。例如:i % 60 * 1000 是进行(i % 60) * 1000运算而不是 i % (60 * 1000)
53.INT: Bad comparison of nonnegative value with negative constant (INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE)
保证非负数和负数进行比较
54.INT: Bad comparison of signed byte (INT_BAD_COMPARISON_WITH_SIGNED_BYTE)
比较有符合数,要先把有符号数转换为无符合数再进行比较
55.IO: Doomed attempt to append to an object output stream (IO_APPENDING_TO_OBJECT_OUTPUT_STREAM)
宣布试图在对象的输出流处添加元素,如果你希望能够添加进一个对象的输出流中必须保证对象的输出流处于打开状态。
56.IP: A parameter is dead upon entry to a method but overwritten (IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN)
The initial value of this parameter is ignored, and the parameter is overwritten here. This often indicates a mistaken belief that the write to the parameter will be conveyed back to the caller.
传入参数的值被忽略,但是对传入值进行了修改,并返回给了调用者
57.MF: Class defines field that masks a superclass field (MF_CLASS_MASKS_FIELD)
子类中定义了和父类中同名的字段。在调用时会出错
58.MF: Method defines a variable that obscures a field (MF_METHOD_MASKS_FIELD)
在方法中定义的局部变量和类变量或者父类变量同名,从而引起字段混淆。
59.NP: Null pointer dereference (NP_ALWAYS_NULL)
对象赋为null值后 没有被重新赋值
60.NP: Null pointer dereference in method on exception path (NP_ALWAYS_NULL_EXCEPTION)
A pointer which is null on an exception path is dereferenced here.
This will lead to a NullPointerException when the code is executed.
Note that because FindBugs currently does not prune infeasible exception paths, this may be a false warning.
Also note that FindBugs considers the default case of a switch statement to be an exception path, since the default case is often infeasible.
空指针引用上调用去除引用方法,将发生空指针异常
61.NP: Method does not check for null argument (NP_ARGUMENT_MIGHT_BE_NULL)
方法没有判断参数是否为空
62.NP: close() invoked on a value that is always null (NP_CLOSING_NULL)
一个为空的对象调用close方法
63.NP: Null value is guaranteed to be dereferenced (NP_GUARANTEED_DEREF)
There is a statement or branch that if executed guarantees that a value is null at this point, and that value that is guaranteed to be dereferenced (except on forward paths involving runtime exceptions).
在正常的null判断分支上,对象去除引用操作是受保护的不允许的
64.NP: Value is null and guaranteed to be dereferenced on exception path (NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH)
There is a statement or branch on an exception path that if executed guarantees that a value is null at this point, and that value that is guaranteed to be dereferenced (except on forward paths involving runtime exceptions).
65.NP: Method call passes null to a nonnull parameter (NP_NONNULL_PARAM_VIOLATION)
方法中为null的参数没有被重新赋值
void test(){
String ss =
public void sya(String ad){
ad.getBytes();
66.NP: Method may return null, but is declared @NonNull (NP_NONNULL_RETURN_VIOLATION)
方法声明了返回值不能为空,但是方法中有可能返回null
67.NP: A known null value is checked to see if it is an instance of a type (NP_NULL_INSTANCEOF)
检查一个为null的值是否是想要的类型对象,而不是由于粗心或者逻辑错误引起的
68.NP: Possible null pointer dereference (NP_NULL_ON_SOME_PATH)
对象可能没有重新赋值
69.NP: Possible null pointer dereference in method on exception path (NP_NULL_ON_SOME_PATH_EXCEPTION)
A reference value which is null on some exception control path is dereferenced here.
This may lead to a NullPointerException when the code is executed.
Note that because FindBugs currently does not prune infeasible exception paths, this may be a false warning.
Also note that FindBugs considers the default case of a switch statement to be an exception path, since the default case is often infeasible.
在异常null值处理分支调用的方法上,可能存在对象去除引用操作
70.NP: Method call passes null for nonnull parameter (NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS)
方法参数中声明为nonnull类型的参数为null
void test(){
String ss =
public void sya(@nonnull String ad){
ad.getBytes();
71.NP: Store of null value into field annotated NonNull (NP_STORE_INTO_NONNULL_FIELD)
为一个已经声明为不能为null值的属性赋值为null。
72.Nm: Class defines equal(Object); should it be equals(Object)? (NM_BAD_EQUAL)
类中定义了一个equal方法但是却不是覆写的Object对象的equals方法
73.Nm: Class defines hashcode(); should it be hashCode()? (NM_LCASE_HASHCODE)
类中定义了一个hashCode方法但是却不是覆写的Object中的hashCode方法
74.Nm: Class defines tostring(); should it be toString()? (NM_LCASE_TOSTRING)
类中定义了一个toString方法但是却不是覆写的Object中的toString方法
75.Nm: Apparent method/constructor confusion (NM_METHOD_CONSTRUCTOR_CONFUSION)
构造方法定义混乱,保证一个标准的构造函数。 例如:
void SA(){
76.Nm: Very confusing method names (NM_VERY_CONFUSING)
混乱的方法命名,如getName和getname方法同时出现的时候
77.Nm: Method doesn't override method in superclass due to wrong package for parameter (NM_WRONG_PACKAGE)
方法因为取了不同包中的同名的对象而没有正确覆写父类中的同名方法
import alpha.F
public class A {
public int f(Foo x) { return 17; }
import beta.F
public class B extends A {
public int f(Foo x) { return 42; }
78.QBA: Method assigns boolean literal in boolean expression (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT)
再if或者while表达式中使用boolean类型的值时应该使用==去判断,而不是采用=操作
79.RC: Suspicious reference comparison (RC_REF_COMPARISON)
比较两个对象值是否相等时应该采用equals方法,而不是==方法
80.RE: Invalid syntax for regular expression (RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION)
对正则表达式使用了错误的语法,会抛出未经检查的异常,表明正则表达式模式中的语法错误。
81.RE: File.separator used for regular expression (RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION)
使用正则表达式使用了错误的文件分隔符,在windows系统中正则表达式不会匹配’\’而应该使用'\\'
82.RV: Random value from 0 to 1 is coerced to the integer 0 (RV_01_TO_INT)
从0到1随机值被强制为整数值0。在强制得到一个整数之前,你可能想得到多个随机值。或使用Random.nextInt(n)的方法。
83.RV: Bad attempt to compute absolute value of signed 32-bit hashcode (RV_ABSOLUTE_VALUE_OF_HASHCODE)
此代码生成一个哈希码,然后计算该哈希码的绝对值。如果哈希码是Integer.MIN_VALUE的,那么结果将是负数(因为Math.abs(Integer.MIN_VALUE的)== Integer.MIN_VALUE的)。
在2^ 32值之外字符串有一个Integer.MIN_VALUE的hashCode包括“polygenelubricants”,“GydZG_”和“,”DESIGNING WORKHOUSES “。
84.RV: Bad attempt to compute absolute value of signed 32-bit random integer (RV_ABSOLUTE_VALUE_OF_RANDOM_INT)
此代码生成一个随机的符号整数,然后计算该随机整数的绝对值。如果随机数生成数绝对值为Integer.MIN_VALUE的,那么结果将是负数(因为Math.abs(Integer.MIN_VALUE的)== Integer.MIN_VALUE的)。
85.RV: Exception created and dropped rather than thrown (RV_EXCEPTION_NOT_THROWN)
此代码创建一个异常(或错误)的对象,但不会用它做任何事情。例如:if (x & 0)
new IllegalArgumentException("x must be nonnegative");
这可能是程序员的意图抛出创建的异常:
if (x & 0)
throw new IllegalArgumentException("x must be nonnegative");
86.RV: Method ignores return value (RV_RETURN_VALUE_IGNORED)
该方法的返回值应该进行检查。这种警告通常出现在调用一个不可变对象的方法,认为它更新了对象的值。例如:String dateString = getHeaderField(name);
dateString.trim();
程序员似乎以为trim()方法将更新dateString引用的字符串。但由于字符串是不可改变的,trim()函数返回一个新字符串值,在这里它是被忽略了。该代码应更正:
String dateString = getHeaderField(name);
dateString = dateString.trim();
87.RpC: Repeated conditional tests (RpC_REPEATED_CONDITIONAL_TEST)
该代码包含对同一个条件试验了两次,两边完全一样例如:(如X == 0 | | x == 0)。可能第二次出现是打算判断别的不同条件(如X == 0 | | y== 0)。
88.SA: Double assignment of field (SA_FIELD_DOUBLE_ASSIGNMENT)
方法中的字段包含了双重任务,例如:
public void foo() {
x = x = 17;
这种为变量赋值是无用的,并可能表明一个逻辑错误或拼写错误。
89.SA: Self assignment of field (SA_FIELD_SELF_ASSIGNMENT)
方法中包含自己对自己赋值的字段。例如:
public void foo() {
90.SA: Self comparison of field with itself (SA_FIELD_SELF_COMPARISON)
字段自己进行自比较可能表明错误或逻辑错误。
91.SA: Self comparison of value with itself (SA_LOCAL_SELF_COMPARISON)
方法中对一个局部变量自身进行比较运算,并可说明错误或逻辑错误。请确保您是比较正确的事情。
92.SA: Nonsensical self computation involving a variable (e.g., x & x) (SA_LOCAL_SELF_COMPUTATION)
此方法对同一变量执行了荒谬的计算(如x&x或x-x)操作。由于计算的性质,这一行动似乎没有意义,并可能表明错误或逻辑错误。
93.SF: Dead store due to switch statement fall through (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH)
在swtich中先前的case值因为swtich执行失败而被覆写,这就像是忘记使用break推出或者没有使用return语句放回先前的值一样。
94.SF: Dead store due to switch statement fall through to throw (SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW)
在swtich中因为出现异常而忽略了对case值的保存。
95.SIC: Deadly embrace of non-static inner class and thread local (SIC_THREADLOCAL_DEADLY_EMBRACE)
如果是一个静态内部类。实际上,在内部类和当前线程有死锁的可能。由于内部类不是静态的,它保留了对外部类的引用。如果线程包含对一个内部类实例的引用,那么内外实例的实例都可以被获取,这样就不具备垃圾会回收的资格。
96.SIO: Unnecessary type check done using instanceof operator (SIO_SUPERFLUOUS_INSTANCEOF)
在进行instanceof操作时进行没有必要的类型检查
97.STI: Unneeded use of currentThread() call, to call interrupted() (STI_INTERRUPTED_ON_CURRENTTHREAD)
此方法调用Thread.currentThread()调用,只需调用interrupted()方法。由于interrupted()是一个静态方法, Thread.interrupted()更简单易用。
98.STI: Static Thread.interrupted() method invoked on thread instance (STI_INTERRUPTED_ON_UNKNOWNTHREAD)
调用不是当前线程对象的Thread.interrupted()方法,由于interrupted()方法是静态的,interrupted方法将会调用一个和作者原计划不同的对象。
99.Se: Method must be private in order for serialization to work (SE_METHOD_MUST_BE_PRIVATE)
这个类实现了Serializable接口,并定义自定义序列化的方法/反序列化。但由于这种方法不能声明为private,将被序列化/反序列化的API忽略掉。
100.Se: The readResolve method must not be declared as a static method. (SE_READ_RESOLVE_IS_STATIC)
为使readResolve方法得到序列化机制的识别,不能作为一个静态方法来声明。
101.UMAC: Uncallable method defined in anonymous class (UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS)
在匿名类中定义了一个既没有覆写超类中方法也不能直接调用的方法。因为在其他类的方法不能直接引用匿名类声明的方法,似乎这种方法不能被调用,这种方法可能只是没有任何作用的代码,但也可能覆写超类中声明。
102.UR: Uninitialized read of field in constructor (UR_UNINIT_READ)
此构造方法中使用了一个尚未赋值的字段或属性。
public SA() {
String abc =
System.out.println(abc);
103.UR: Uninitialized read of field method called from constructor of superclass (UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR)
方法被超类的构造函数调用时,在当前类中的字段或属性还没有被初始化。例如:
abstract class A {
abstract Object getValue();
hashCode = getValue().hashCode();
class B extends A {
B(Object v) {
this.value =
Object getValue() {
当B是创建时,A的构造函数将在B为value赋值之前触发,然而在A的初始化方法调用getValue方法时value这个变量还没有被初始化。
104.USELESS_STRING: Invocation of toString on an array (DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY)
该代码调用上匿名数组的toString()方法,产生的结果形如[@ 16f0472并没有实际的意义。考虑使用Arrays.toString方法来转换成可读的字符串,提供该数组的内容数组。例如:
String[] a = { "a" };
System.out.println(a.toString());
//正确的使用为
System.out.println(Arrays.toString(a));
105.USELESS_STRING: Invocation of toString on an array (DMI_INVOKING_TOSTRING_ON_ARRAY)
该代码调用上数组的toString()方法,产生的结果形如[@ 16f0472并不能显示数组的真实内容。考虑使用Arrays.toString方法来转换成可读的字符串,提供该数组的内容数组
106.UwF: Field only ever set to null (UWF_NULL_FIELD)
字段的值总是为null值,所有读取该字段的值都为null。检查错误,如果它确实没有用就删除掉。
107.UwF: Unwritten field (UWF_UNWRITTEN_FIELD
此字段是永远不会写入值。所有读取将返回默认值。检查错误(如果它被初始化?),如果它确实没有用就删除掉。
五:Performance关于代码性能相关方面的
1.Bx: Primitive value is boxed and then immediately unboxed (BX_BOXING_IMMEDIATELY_UNBOXED)
对原始值进行装箱,然后立即取消装箱。这可能是在一个未要求装箱的地方进行了手动装箱,从而迫使编译器进行立即撤消装箱的操作
2.Bx: Primitive value is boxed then unboxed to perform primitive coercion (BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION)
对原始值进行装箱然后立即把它强制转换为另外一种原始类型。例如:
new Double(d).intValue()应该直接进行强制转换例如:(int) d
3.Bx: Method allocates a boxed primitive just to call toString (DM_BOXED_PRIMITIVE_TOSTRING)
仅仅为了调用封装类的toString()而对原始类型进行封装操作。比这种方法更有效的是调用封装类的toString(…)方法例如:
new Integer(1).toString()
Integer.toString(1)
new Long(1).toString()
Long.toString(1)
new Float(1.0).toString()
Float.toString(1.0)
new Double(1.0).toString()
Double.toString(1.0)
new Byte(1).toString()
Byte.toString(1)
new Short(1).toString()
Short.toString(1)
new Boolean(true).toString()
Boolean.toString(true)
4.Bx: Method invokes inefficient floating-point N use static valueOf instead (DM_FP_NUMBER_CTOR)
使用new Double(double)方法总是会创建一个新的对象,然而使用Double.valueOf(double)方法可以把值保存在编辑器或者class library、JVM中。使用存储值的方式来避免对象的分配可以或得更好的代码性能
除非类必须符合Java 1.5以前的JVM,否则请使用自动装箱或valueOf()方法创建Double和Float实例。
5.Bx: Method invokes inefficient N use static valueOf instead (DM_NUMBER_CTOR)
使用new Integer(int)方法总是会创建一个新的对象,然而使用Integer.valueOf(int)方法可以把值保存在编辑器或者class library、JVM中。使用存储值的方式来避免对象的分配可以或得更好的代码性能
除非类必须符合Java 1.5以前的JVM,否则请使用自动装箱或valueOf()方法创建Long, Integer, Short, Character, Byte实例。
6.Dm: The equals and hashCode methods of URL are blocking (DMI_BLOCKING_METHODS_ON_URL)
使用equals和hashCode方法来对url进行资源标识符解析时会引起堵塞。考虑使用java.net.URI来代替。
7.Dm: Maps and sets of URLs can be performance hogs (DMI_COLLECTION_OF_URLS)
方法或者字段使用url的map/set集合。因为equals方法或者hashCode方法来进行资源标识符解析时都会引起堵塞。考虑使用java.net.URI来代替。
8.Dm: Method invokes inefficient B use Boolean.valueOf(...) instead (DM_BOOLEAN_CTOR)
使用new方法创建一个java.lang.Boolean类型能够的实例对象是浪费空间的,因为Boolean对象是不可变的而且只有两个有用的值。使用Boolean.valueOf()或者Java1.5中的自动装箱功能来创建一个Boolean实例。
9.Dm: Explici extremely dubious except in benchmarking code (DM_GC)
在代码中显式的调用垃圾回收命名,这样做并不能起作用。在过去,有人在关闭操作或者finalize方法中调用垃圾回收方法导致了很多的性能浪费。这样大规模回收对象时会造成处理器运行缓慢。
10.Dm: Use the nextInt method of Random rather than nextDouble to generate a random integer (DM_NEXTINT_VIA_NEXTDOUBLE)
如果r是一个java.util.Random对象,你可以使r.nextInt(n)生成一个0到n-1之前的随机数,而不是使用(int)(r.nextDouble() * n)
11.Dm: Method invokes inefficient new String(String) constructor (DM_STRING_CTOR)
使用java.lang.String(String)构造函数会浪费内存因为这种构造方式和String作为参数在功能上容易混乱。只是使用String直接作为参数的形式
12.Dm: Method invokes toString() method on a String (DM_STRING_TOSTRING)
调用String.toString()是多余的操作,只要使用String就可以了。
13.Dm: Method invokes inefficient new String() constructor (DM_STRING_VOID_CTOR)
使用没有参数的构造方法去创建新的String对象是浪费内存空间的,因为这样创建会和空字符串“”混淆。Java中保证完成相同的构造方法会产生描绘相同的String对象。所以你只要使用空字符串来创建就可以了。
14.ITA: Method uses toArray() with zero-length array argument (ITA_INEFFICIENT_TO_ARRAY)
当使用集合的toArray()方法时使用数组长度为0的数组作为参数。比这更有效的一种方法是
myCollection.toArray(new Foo[myCollection.size()]),如果数组的长度足够大就可以直接把集合中的内容包装到数组中直接返回从而避免了第二次创建一个新的数组来存放集合中值。
15.SBSC: Method concatenates strings using + in a loop (SBSC_USE_STRINGBUFFER_CONCATENATION)
在循环中构建一个String对象时从性能上讲使用StringBuffer来代替String对象
// This is bad
String s = "";
for (int i = 0; i & field. ++i) {
s = s + field[i];
// This is better
StringBuffer buf = new StringBuffer();
for (int i = 0; i & field. ++i) {
buf.append(field[i]);
String s = buf.toString();
16.SS: Unread field: should this field be static? (SS_SHOULD_BE_STATIC)
类中所包含的final属性字段在编译器中初始化为静态的值。考虑在定义时就把它定义为static类型的。
17.UM: Method calls static Math class method on a constant value (UM_UNNECESSARY_MATH)
在方法中使用了java.lang.Math的静态方法代替常量来使用,使用常量速度和准确度会更好。 以下为Math中的方法产生的值。
Method Parameter
acos 0.0 or 1.0
asin 0.0 or 1.0
atan 0.0 or 1.0
atan2 0.0 cbrt 0.0 or 1.0
ceil -any-
exp 0.0 or 1.0
floor -any-
log 0.0 or 1.0
log10 0.0 or 1.0
rint -any-
round -any-
sqrt 0.0 or 1.0
toDegrees 0.0 or 1.0
toRadians 0.0
18.UPM: Private method is never called (UPM_UNCALLED_PRIVATE_METHOD)
定义为Private类型方法从未被调用,应该被删除。
19.UrF: Unread field (URF_UNREAD_FIELD)
类中定义的属性从未被调用,建议删除。
20.UuF: Unused field (UUF_UNUSED_FIELD)
类中定义的属性从未被使用,建议删除。
21.WMI: Inefficient use of keySet iterator instead of entrySet iterator (WMI_WRONG_MAP_ITERATOR)
当方法中接受一个Map类型的参数时,使用keySet的迭代器比使用entrySet的迭代器效率要高。
六:Internationalization关于代码国际化相关方面的
Dm: Consider using Locale parameterized version of invoked method (DM_CONVERT_CASE)
使用平台默认的编码格式对字符串进行大小写转换,这可能导致国际字符的转换不当。使用以下方式对字符进行转换
String.toUpperCase( Locale l )
String.toLowerCase( Locale l )
七:Multithreaded correctness关于代码多线程正确性相关方面的
1.DL: Synchronization on Boolean could lead to deadlock (DL_SYNCHRONIZATION_ON_BOOLEAN)
该代码同步一个封装的原始常量,例如一个Boolean类型。
private static Boolean inited = Boolean.FALSE;
synchronized(inited) {
if (!inited) {
inited = Boolean.TRUE;
由于通常只存在两个布尔对象,此代码可能是同步的其他无关的代码中相同的对象,这时会导致反应迟钝和可能死锁
2.DL: Synchronization on boxed primitive could lead to deadlock (DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE)
该代码同步一个封装的原始常量,例如一个Integer类型。
private static Integer count = 0;
synchronized(count) {
由于Integer对象可以共享和保存,此代码可能是同步的其他无关的代码中相同的对象,这时会导致反应迟钝和可能死锁
3.DL: Synchronization on interned String could lead to deadlock (DL_SYNCHRONIZATION_ON_SHARED_CONSTANT)
同步String类型的常量时,由于它被JVM中多个其他的对象所共有,这样在其他代码中会引起死锁。
4.DL: Synchronization on boxed primitive values (DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE)
同步一个显然不是共有封装的原始值,例如一个Integer类型的对象。例如:
private static final Integer fileLock = new Integer(1);
synchronized(fileLock) {
.. do something ..
它最后被定义为以下方式来代替:private static final Object fileLock = new Object();
5.Dm: Monitor wait() called on Condition (DM_MONITOR_WAIT_ON_CONDITION)
方法中以java.util.concurrent.locks.Condition对象调用wait()。等待一个条件发生时应该使用在Condition接口中定义的await()方法。
6.Dm: A thread was created using the default empty run method (DM_USELESS_THREAD)
这个方法没有通过run方法或者具体声明Thread类,也没有通过一个Runnable对象去定义一个线程,而这个线程出来浪费资源却什么也没有去做。
7.ESync: Empty synchronized block (ESync_EMPTY_SYNC)
该代码包含一个空的同步块:synchronized() {}
8.IS: Inconsistent synchronization (IS2_INCONSISTENT_SYNC)
不合理的同步
9.IS: Field not guarded against concurrent access (IS_FIELD_NOT_GUARDED)
域不是良好的同步访问---
此字段被标注为net.jcip.annotations.GuardedBy,但可以在某种程度上违反注释而去访问
10.JLM: Synchronization performed on Lock (JLM_JSR166_LOCK_MONITORENTER)
实现java.util.concurrent.locks.Lock的对象调用了同步的方法。应该这样处理,对象被锁定/解锁时使用acquire()/ release()方法而不是使用同步的方法。
11.LI: Incorrect lazy initialization of static field (LI_LAZY_INIT_STATIC)
静态域不正确的延迟初始化--
这种方法包含了一个不同步延迟初始化的非volatile静态字段。因为编译器或处理器可能会重新排列指令,如果该方法可以被多个线程调用,线程不能保证看到一个完全初始化的对象。你可以让字段可变来解决此问题
12.LI: Incorrect lazy initialization and update of static field (LI_LAZY_INIT_UPDATE_STATIC)
这种方法包含一个不同步延迟初始化的静态字段。之后为字段赋值,对象存储到该位置后进一步更新或访问。字段后尽快让其他线程能够访问。如果该方法的进一步访问该字段为初始化对象提供服务,然后你有一个非常严重的多线程bug,除非别的东西阻止任何其他线程访问存储的对象,直到它完全初始化。
即使你有信心,该方法是永远不会被多个线程调用时,在它的值还没有被充分初始化或移动,不把它设定为static字段时它可能会更好。
13.ML: Method synchronizes on an updated field (ML_SYNC_ON_UPDATED_FIELD)
对象获取一个可变字段时进行同步。这是没有意义的,因为不同的线程可以在不同的对象同步。
14.MSF: Mutable servlet field (MSF_MUTABLE_SERVLET_FIELD)
一个web服务一般只能创建一个servlet或者jsp的实例(例如:treates是一个单利类),它会被多个线程调用这个实例的方法服务于多个同时的请求。因此使用易变的字段属性产生竞争的情况。
15.MWN: Mismatched notify() (MWN_MISMATCHED_NOTIFY)
此方法调用Object.notify()或Object.notifyAll()而没有获取到该对象的对象锁。调用notify()或notifyAll()而没有持有该对象的对象锁,将导致IllegalMonitorStateException异常。
16.MWN: Mismatched wait() (MWN_MISMATCHED_WAIT)
此方法调用Object.wait()而没有获取到该对象的对象锁。调用wait()而没有持有该对象的对象锁,将导致IllegalMonitorStateException异常。
17.NP: Synchronize and null check on the same field. (NP_SYNC_AND_NULL_CHECK_FIELD)
如果代码块是同步的,那么久不可能为空。如果是空,同步时就会抛出NullPointerException异常。最好是在另一个代码块中进行同步。
18.No: Using notify() rather than notifyAll() (NO_NOTIFY_NOT_NOTIFYALL)
调用notify()而不是notifyAll()方法。 Java的监控器通常用于多个条件。调用notify()只唤醒一个线程,这意味着该线程被唤醒只是满足的当前的唯一条件。
19.RS: Class's readObject() method is synchronized (RS_READOBJECT_SYNC)
序列化类中定义了同步的readObject()。通过定义,反序列化创建的对象只有一个线程可以访问,因此没有必要的readObject()进行同步。如果的readObject()方法本身造成对象对另一个线程可见,那么这本身就是不好的编码方式。
20.Ru: Invokes run on a thread (did you mean to start it instead?) (RU_INVOKE_RUN)
这种方法显式调用一个对象的run()。一般来说,类是实现Runnable接口的,因为在一个新的线程他们将有自己的run()方法,在这种情况下Thread.start()方法调用是正确的。
21.SC: Constructor invokes Thread.start() (SC_START_IN_CTOR)
在构造函数中启动一个线程。如果类曾经被子类扩展过,那么这很可能是错的,因为线程将在子类构造之前开始启动。
22.SP: Method spins on field (SP_SPIN_ON_FIELD)
方法无限循环读取一个字段。编译器可合法悬挂宣读循环,变成一个无限循环的代码。这个类应该改变,所以使用适当的同步(包括等待和通知要求)
23.STCAL: Call to static Calendar (STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE)
即使JavaDoc对此不包含暗示,而Calendars本身在多线程中使用就是不安全的。探测器发现当调用Calendars的实例时将会获得一个静态对象。
Calendar rightNow = Calendar.getInstance();
24.STCAL: Call to static DateFormat (STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE)
在官方的JavaDoc,DateFormats多线程使用本事就是不安全的。探测器发现调用一个DateFormat的实例将会获得一个静态对象。
myString = DateFormat.getDateInstance().format(myDate);
25.STCAL: Static Calendar (STCAL_STATIC_CALENDAR_INSTANCE)
Calendar在多线程中本身就是不安全的,如果在线程范围中共享一个Calendarde 实例而不使用一个同步的方法在应用中就会出现一些奇怪的行为。在sun.util.calendar.BaseCalendar.getCalendarDateFromFixedDate()中会抛出ArrayIndexOutOfBoundsExceptions or IndexOutOfBoundsExceptions异常。
26.STCAL: Static DateFormat (STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE)
DateFormat 在多线程中本身就是不安全的,如果在线程范围中共享一个DateFormat的实例而不使用一个同步的方法在应用中就会出现一些奇怪的行为。
27.SWL: Method calls Thread.sleep() with a lock held (SWL_SLEEP_WITH_LOCK_HELD)
当持有对象时调用Thread.sleep()。这可能会导致很差的性能和可扩展性,或陷入死锁,因为其他线程可能正在等待获得锁。调用wait()是一个更好的主意,释放对象的持有以允许其他线程运行。
28.UG: Unsynchronized get method, synchronized set method (UG_SYNC_SET_UNSYNC_GET)
这个类包含类似命名的get和set方法。在set方法是同步方法和get方法是非同步方法。这可能会导致在运行时的不正确行为,因为调用的get方法不一定返回对象一致状态。 GET方法应该同步。
29.UL: Method does not release lock on all paths (UL_UNRELEASED_LOCK)
方法获得了当前的对象所,但是在方法中始终没有释放它。一个正确的示例如下:
Lock l = ...;
// do something
} finally {
l.unlock();
30.UL: Method does not release lock on all exception paths (UL_UNRELEASED_LOCK_EXCEPTION_PATH)
方法获得了当前的对象所,但是在所有的异常处理中始终没有释放它。一个正确的示例如下:
Lock l = ...;
// do something
} finally {
l.unlock();
31.UW: Unconditional wait (UW_UNCOND_WAIT)
方法中包含调用java.lang.Object.wait(),而却没有放到条件流程控制中。该代码应确认条件尚未满足之前等待;先前任何通知将被忽略。
32.VO: A volatile reference to an array doesn't treat the array elements as volatile (VO_VOLATILE_REFERENCE_TO_ARRAY)
声明一个变量引用数组,这可能不是你想要的。如果一个变量引用数组,那么对引用数组的读和写都是不安全的,但是数组元素不是变量。取得数组的变量值你可以使用java.util.concurrent包中的数组的原子性特性
33.WL: Sychronization on getClass rather than class literal (WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL)
实例的方法中同步this.getClass(),如果这个类有子类集合,那么子类集合中的对象将会在这个类的各个子类上进行同步,这不是我们想要的效果,我们只要同步当前的类对象而不包含它的所有子类,可以同步类名.getClass()。例如,java.awt.Label的代码:
private static final String base = "label";
private static int nameCounter = 0;
String constructComponentName() {
synchronized (getClass()) {
return base + nameCounter++;
Label中的子类集合不可能在同一个子对象上进行同步,替换上面的方法为:
private static final String base = "label";
private static int nameCounter = 0;
String constructComponentName() {
synchronized (Label.class) {
return base + nameCounter++;
34.WS: Class's writeObject() method is synchronized but nothing else is (WS_WRITEOBJECT_SYNC)
这个类有一个writeObject()方法是同步的,但是这个类中没有其他的同步方法。
35.Wa: Condition.await() not in loop (WA_AWAIT_NOT_IN_LOOP)
方法没有在循环中调用java.util.concurrent.await()。如果对象是用于多种条件,打算调用wait()方法的条件可能不是实际发生的。
36.Wa: Wait not in loop (WA_NOT_IN_LOOP)
这种方法包含调用java.lang.Object.wait(),而这并不是一个循环。如果监视器用于多个条件,打算调用wait()方法的条件可能不是实际发生的。
八:Malicious codevulnerability关于恶意破

我要回帖

更多关于 清穿之杯具时代 的文章

 

随机推荐