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的类型做任何的假设。⽐较此对象与指定的对象。当且仅当该参数不为 null,并且是表⽰与此对象相同的类型的对象时,结果才为 true。
Comparison of String objects using == or != ⽤==或者!=去⽐较String类型的对象
Method might ignore exception ⽅法可能忽略异常
Method it() 在⽅法中调⽤it(…)语句,考虑⽤RuntimeException来代替
Method ignores result ad() ad⽅法忽略返回的多个字符,如果对结果没有检查就没法正确处理⽤户读取少量字符请求的情况。
Dodgy code 糟糕的代码
Switch statement found where default case is missing Switch没有默认情况下执⾏的case语句
Switch statement found where one case falls through to the next case Switch语句中⼀个分⽀执⾏后⼜执⾏了下⼀个分⽀。通常case后⾯要跟break 或者return语句来跳出。
Dead store to local variable 该指令为局部变量赋值,但在其后的没有对她做任何使⽤。通常,这表明⼀个错误,因为值从未使⽤过。
Write to static field from instance method 在实例⽅法写⼊静态字段
Redundant nullcheck of value known to be non-null ⽅法中对不为空的值进⾏为空的判断。
Method uses the same code for two branches 此⽅法使⽤相同的代码,以实现两个有条件的分⽀。检查以确保这是不是⼀个编码错误
Exception is caught when Exception is not thrown 在try/catch块中捕获异常,但是异常没有在try语句中抛出⽽RuntimeException⼜没有明确的被捕获Integral division result cast to double or float 整形数除法强制转换为double或者float类型。
Possible null pointer dereference due to return value of called method ⽅法的返回值没有进⾏是否为空的检查就重新赋值,这样可能会出现空指针异常。Useless object created 对象创建了并没有⽤
Unread public/protected field 没有⽤到的字段
Internationalization 关于代码国际化相关⽅⾯的
Consider using Locale parameterized version of invoked method
使⽤平台默认的编码格式对字符串进⾏⼤⼩写转换,这可能导致国际字符的转换不当。使⽤以下⽅式对字符进⾏转换
Performance 关于代码性能相关⽅⾯的
Boxing/unboxing to parse a primitive 类型转换⽐如字符串转换成int 应该使⽤Integer.parseInt(“”) 代替Integer.valueOf(“”)
Method concatenates string using + in aloop
每次循环⾥的字符串+连接,都会新产⽣⼀个string对象,在java中,新建⼀个对象的代价是很昂贵的,特别是在循环语句中,效率较低
equals()方法解决办法:使⽤StringBuffer或者StringBuilder重⽤对象。
Private method is never called 私有⽅法没有被调⽤
Explicit garbage collection;extremely dubious except in benchmarking code
在代码中显式的调⽤垃圾回收命名,这样做并不能起作⽤。在过去,有⼈在关闭操作或者finalize⽅法中调⽤垃圾回收⽅法导致了很多的性能浪费。这样⼤规模回收对象时会造成处理器运⾏缓慢。
Unread field:should this field be static? 没有⽤到的static 字段
should be a static inner class 此内部类应该使⽤static修饰
Experimental
Method may fail to clean up stream or resource on checked exception
这种⽅法可能⽆法清除(关闭,处置)⼀个流,数据库对象,或其他资源需要⼀个明确的清理⾏动
解决⽅法:流的关闭都写在finally⾥⾯
Malicious code vulnerability 关于恶意破坏代码相关⽅⾯的
May expose internal representation by incorporating reference to mutable object
此代码把外部可变对象引⽤存储到对象的内部表⽰。如果实例受到不信任的代码的访问和没有检查的变化危及对象和重要属性的安全。存储⼀个对象的副本,在很多情况下是更好的办法。
Field isn't final but should be 此字段前应该加final
Field isn't final and can't be protected from malicious code 此字段前应该加final
Field should be package protected
⼀个静态字段是可以被恶意代码或其他的包访问修改。可以把这种类型的字段声明为final类型的以防⽌这种错误。
Multithreaded correctness 关于代码正确性相关⽅⾯的
Static DateFormat DateFormat 在多线程中本⾝就是不安全的,如果在线程范围中共享⼀个DateFormat的实例⽽不使⽤⼀个同步的⽅法在应⽤中就会出现⼀些奇怪的⾏为。
Call to static DateFormat DateFormats多线程使⽤本事就是不安全的,改进⽅法:需要创建多实例或线程同步
Correctness 关于代码正确性相关⽅⾯的
Nullcheck of value previously dereferenced 此代码之前废弃null值检查。解决办法进⾏null检查
Possible null pointer dereference 可能为null
Null pointer dereference 对象赋为null值后没有被重新赋值
Possible null pointer dereference in method on exception path 在异常null值处理分⽀调⽤的⽅法上,可能存在对象去除引⽤操作
value is null and guaranteed to be dereferenced on exception path exception分⽀上,存在引⽤⼀个null对象的⽅法,引发空指针异常。
Self comparison of value with itself ⽅法中对⼀个局部变量⾃⾝进⾏⽐较运算,并可说明错误或逻辑错误。请确保您是⽐较正确的事情。
An apparent infinite recursive loop 明显的⽆限迭代循环,将导致堆栈溢出.
到此这篇关于IDEA插件FindBugs的使⽤详解的⽂章就介绍到这了,更多相关IDEA插件FindBugs内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。