FindBugs-IDEA 插件的使用

编码规范检查的插件有很多种,有FireLine 火狐的    有阿里巴巴的 今天要说的是 FindBugs-IDEA 这款编码规范检查的插件。

上图~

然后

安装完之后,重启studio,会发现左下角会出现findbugs的图标 

可以分析单个文件,包下面的所有文件,整个module下的文件,整个project下的文件,

右键想要分析的文件名/包名/module名/project

这里常用的就是表示的四种  以下 我在细分一下每个所对应的功能:(按照从上至下的顺序)

  1. 分析当前文件
  2. 分析包内所有文件
  3. 分析当前模块的所有文件
  4. 分析项目中的所有文件(这个按钮就是分析检测当前project中所有文件,找出bugs。)
  5. 分析范围内的所有文件(这个按钮就是分析检测当前文件一定范围中所有文件)
  6. 分析所有模块内的所有文件(这个按钮就是检测所有模块中的代码缺陷,主要和第一个按钮功能还是差不多)
  7. 分析改变的所有文件(这个按钮一般显示都是暗色的点击不了,当有svn等版本控制时改变后才能点击检测)  

 

分析中会如下图所示:(在Build)

分析完之后就会出现结果面板 如下图所示:

细分一下左侧四列 都是干什么用的:如下图所示。

我又上网搜索了一下常见的一些 错误信息  如下:(按照图片中的顺序 依次介绍)

Correctness  (关于代码正确性相关方面的)

  1. Nullcheck of value previously dereferenced 此代码之前废弃null值检查。解决办法 进行null检查 
  2. Possible null pointer dereference 可能为null 
  3. Null pointer dereference 对象赋为null值后 没有被重新赋值 
  4. Possible null pointer dereference in method on exception path 在异常null值处理分支调用的方法上,可能存在对象去除引用操作 
  5. value is null and guaranteed to be dereferenced on exception path exception分支上,存在引用一个null对象的方法,引发空指针异常。 
  6. Self comparison of value with itself 方法中对一个局部变量自身进行比较运算,并可说明错误或逻辑错误。请确保您是比较正确的事情。 
  7. An apparent infinite recursive loop 明显的无限迭代循环,将导致堆栈溢出

Bad practice (代码中的一些坏习惯)

  1. Class names should start with an upper case letter 主要包括类名的命名,以大写字母开头 
  2. Method names should start with a lower case letter 方法名以小写字母开头 
  3. Field names should start with a lower case letter 字段名以小写字母开头 
  4. equals()method does not check for null argument equals()方法应该检查非空 
  5. Class defines equals() and uses Object.hashCode() 一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法 
  6. Method ignores exceptional return value 方法忽略返回值的异常信息 
  7. Equals method should not assume anything about the type of its argument equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的类型的对象时,结果才为 true。 
  8. Comparison of String objects using == or != 用==或者!=去比较String类型的对象 
  9. Method might ignore exception 方法可能忽略异常 
  10. Method invokes System.exit() 在方法中调用System.exit(…)语句,考虑用RuntimeException来代替 
  11. Method ignores result of InputStream.read() InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。 
     

Dodgy code (糟糕的代码)

  1. Switch statement found where default case is missing Switch没有默认情况下执行的case语句 
  2. Switch statement found where one case falls through to the next case Switch语句中一个分支执行后又执行了下一个分支。通常case后面要跟break 或者return语句来跳出。 
  3. Dead store to local variable 该指令为局部变量赋值,但在其后的没有对她做任何使用。通常,这表明一个错误,因为值从未使用过。 
  4. Write to static field from instance method 在实例方法写入静态字段 
  5. Redundant nullcheck of value known to be non-null 方法中对不为空的值进行为空的判断。 
  6. Method uses the same code for two branches 此方法使用相同的代码,以实现两个有条件的分支。检查以确保这是不是一个编码错误 
  7. Exception is caught when Exception is not thrown 在try/catch块中捕获异常,但是异常没有在try语句中抛出而RuntimeException又没有明确的被捕获 
  8. Integral division result cast to double or float 整形数除法强制转换为double或者float类型。 
  9. Possible null pointer dereference due to return value of called method 方法的返回值没有进行是否为空的检查就重新赋值,这样可能会出现空指针异常。 
  10. Useless object created 对象创建了并没有用 
  11. Unread public/protected field 没有用到的字段 
  12. Internationalization 关于代码国际化相关方面的
  13. Consider using Locale parameterized version of invoked method 
  14. 使用平台默认的编码格式对字符串进行大小写转换,这可能导致国际字符的转换不当。使用以下方式对字符进行转换 

Performance (关于代码性能相关方面的)

  1. Boxing/unboxing to parse a primitive 类型转换 比如字符串转换成int 应该使用Integer.parseInt(“”) 代替Integer.valueOf(“”) 
  2. Method concatenates string using + in aloop 
  3. 每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低 
  4. 解决办法:使用StringBuffer或者StringBuilder重用对象。 
  5. Private method is never called 私有方法没有被调用 
  6. Explicit garbage collection;extremely dubious except in benchmarking code 
  7. 在代码中显式的调用垃圾回收命名,这样做并不能起作用。在过去,有人在关闭操作或者finalize方法中调用垃圾回收方法导致了很多的性能浪费。这样大规模回收对象时会造成处理器运行缓慢。 
  8. Unread field:should this field be static? 没有用到的static 字段 
  9. should be a static inner class 此内部类应该使用static修饰 
     

Malicious code vulnerability (关于恶意破坏代码相关方面的

//TODO 后续更新

这里面 我看了一下  就是 static  没有加final的  其他的还没看到 

Multithreaded correctness (关于代码正确性相关方面的)

  1. Static DateFormat DateFormat 在多线程中本身就是不安全的,如果在线程范围中共享一个DateFormat的实例而不使用一个同步的方法在应用中就会出现一些奇怪的行为。 
  2. Call to static DateFormat DateFormats多线程使用本事就是不安全的,改进方法:需要创建多实例或线程同步 

*Class defines field that masks a superclass field *
子类中定义了和父类中同名的字段。在调用时会出错

Uninitialized read of field in constructor (UR_UNINIT_READ)
此构造方法中使用了一个尚未赋值的字段或属性。

 

差不多就这些了。如果有更新  后续会继续添加。请持续关注呦~~~~~

 

发布了19 篇原创文章 · 获赞 28 · 访问量 4755
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术工厂 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览