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 invokes System.exit() 在方法中调用System.exit(…)语句,考虑用RuntimeException来代替
Method ignores result of InputStream.read() InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。

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中,新建一个对象的代价是很昂贵的,特别是在循环语句中,效率较低
解决办法:使用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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 完美解决idea无法搜索下载插件的问题

    IDEA无法搜索插件 最近重装了系统,需要配置好多环境,但当我在idea中搜索插件的时候,发现idea Plugins居然搜索不到插件,百度了下,有些是设置idea勾选的,不过我试了之后,然并卵.... 我的解决办法: 我的这个问题研究了好长时间,最后居然发现是我这边宽带运营商的问题,运营商国内网速很ok,但却屏蔽了idea下载插件的网址..最后手机开热点解决...... 补充知识:解决idea不能搜索任何插件 出现原因:IDEA的模块系统加载不出来,是由于IDEA的网络安全机制造成的,类似于w

  • IDEA插件之Mybatis Log plugin 破解及安装方法

    前言 今天重新装了IDEA2020,顺带重装了一些插件,毕竟这些插件都是习惯一直在用,其中一款就是Mybatis Log plugin,按照往常的思路,在IDEA插件市场搜索安装,艹,眼睛一瞟,竟然收费了,对于我这种支持盗版的人来说太难了,于是自己开始捣鼓各种尝试破解,下文分享自己的破解方式. 什么是Mybatis Log plugin 举个栗子,通常在找bug的时候都会查看执行了什么SQL,想把这条SQL拼接出来执行调试,可能有些小白还在傻傻的把各个参数复制出来,补到?占位符中,哈哈. 简单的

  • 解决IDEA2020.2插件lombok报错问题(亲测有效)

    先看看问题是否和我一样 由于我的修复好了,所以我的没错误了,我指出我以前的错误看是否匹配 当你只写一个注解的时候是好的,有时候写第一个注解的时候就崩了,第二个注解就更不用说了 是不是下面这个红框框的标志都不见了?并且你的右下角也报错了 如果是可以直接下载这个非官方补丁: 链接:https://pan.baidu.com/s/1QvDWMN3aihHHus9f1pVPFQ 提取码:we6s 下载下来后是直接是这个样子的 因为我安装的是解压后的,所以我发的是解压后的,如果安装有问题可以在评论区告诉我

  • 懒人 IDEA 插件推荐: EasyCode 一键帮你生成所需代码(Easycode用法)

    Easycode是idea的一个插件,可以直接对数据的表生成entity.controller.service.dao.mapper无需任何编码,简单而强大. 1.安装(EasyCode) 我这里的话是已经那装好了. 建议大家在安装一个插件,叫做Lombok. Lombok能通过注解的方式,在编译时自动为属性生成构造器.getter/setter.equals.hashcode.toString方法.出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有gett

  • IntelliJ IDEA2020、pycharm、webstorm激活永久激活及使用教程(总目录篇) 原创

    IntelliJ IDEA的简介   IDEA 全称IntelliJ IDEA,是用于java语言开发的集成环境(也可用于其他语言),IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主. 官网介绍    IntelliJ IDEA的每个

  • IDEA插件FindBugs的使用详解

    前言 Findbugs很多人都并不陌生,Eclipse中有插件可以帮助查找代码中隐藏的bug,IDEA中也有这款插件.这个插件可以帮助我们查找隐藏的bug,比较重要的功能就是查找潜在的null指针. 在编写代码的过程中,我们可能不会一直记得检查空的引用,在我们测试时可能很难发现问题,但是应用上线之后,面对大量的用户,很多问题就会浮现出来.所以在编码时,使用findbugs检查一下很有必要. 安装 安装完之后,重启studio,会发现左下角会出现findbugs的图标 可以分析单个文件,包下面的所

  • jQuery图片缩放插件smartZoom使用实例详解

    e-smart-zoom-jquery.js插件,下载地址及示例:https://github.com/e-smartdev/smartJQueryZoom 插件描述:通过将鼠标悬停在图片上,滚动鼠标滚轮即可实现图片的放大或者缩小效果. smartZoom使用 举个栗子,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <tit

  • jQuery.Validate表单验证插件的使用示例详解

    jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求. 请在这里查看示例 validate示例 示例包含 验证错误时,显示红色错误提示 自定义验证规则 引入中文错误提示 重置表单需要执行2句话 源码示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

  • vue 使用axios 数据请求第三方插件的使用教程详解

    axios 基于http客户端的promise,面向浏览器和nodejs 特色 •浏览器端发起XMLHttpRequests请求 •node端发起http请求 •支持Promise API •监听请求和返回 •转化请求和返回 •取消请求 •自动转化json数据 •客户端支持抵御 安装 使用npm: $ npm i axiso 为了解决post默认使用的是x-www-from-urlencoded 去请求数据,导致请求参数无法传递到后台,所以还需要安装一个插件QS $ npm install qs

  • vue 插件的方法代码详解

    在开发项目的时候,我们一般都用 vue-cli 来避免繁琐的 webpack 配置和 template 配置.但是官方 cli3 现在并不支持搭建 plugin 开发的项目. 还好,已经有大神(Kazupon)走在了我们前面,我们就用现成的vue-cli-plugin-p11n. 如果你没有安装 vue-cli,请先安装 npm i -g @vue/cli 首先,搭建项目 vue create [your plugin name] && cd [your plugin name] vue

  • bootstrap中日历范围选择插件daterangepicker的使用详解

    daterangepicker是bootstrap的一个日历插件 主要用来选择时间段的插件 这个插件很好用 也很容易操作  引入相关插件 <!-- 需要引用的依赖库 --> <script type="text/javascript" src="//cdn.jsdelivr.net/jquery/1/jquery.min.js"></script> <script type="text/javascript&quo

  • jQuery.validate.js表单验证插件的使用代码详解

    Validate Validate是基于jQuery的一款轻量级验证插件,内置丰富的验证规则,还有灵活的自定义规则接口,HTML.CSS与JS之间的低耦合能让您自由布局和丰富样式,支持input,select,textarea的验证. 效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="vi

  • VSCode的使用配置以及VSCode插件的安装教程详解

    配置篇 打开设置界面 许多设置都需要在设置界面进行,所以想要配置第一步就应该是打开设置界面. 1> 鼠标操作打开.File --> Preferences --> Settings 2> 界面左下角的设置图标 打开设置有的是代码视图,有的不是,可以通过设置右上角的三个点进行切换. tab键的缩进控制 VSCode默认的tab键是缩进4个空格,但是有很多时候我们需要修改这个缩进,如vue用ES6的时候缩进4个空格会报错,这里我们就可以修改这个配置. 首先就是打开设置 直接搜索 tab

  • IDEA的Mybatis Log Plugin插件配置和使用详解

    在使用Mybatis开发项目时,由于避免出现SQL注入,大部分情况下都是使用#{}占位符的方式传参. 所以日志打印SQL时,打印的也是占位符,如: 如果SQL比较复杂,参数又很多的话,要通过日志拼凑真正可执行的SQL还是件比较头痛的事情. 好在IDEA有款很不错的插件(Mybatis Log Plugin)可以解决上述问题. 插件安装 像其它插件一样,可选择在线安装和离线安装. 在线安装:搜索Mybatis Log Plugin,直接install即可.离线安装:可从:http://plugin

  • 关于在IDEA热部署插件JRebel使用问题详解

    问题描述: 在日常开发工作中,代码出现问题时往往要不停的修改测试验证其正确性.每一次修改代码都需要重启项目,十分耗时,对于企业大型项目来说重启一次项目的时间够你去喝杯咖啡了.为了减少项目重启的时间所以来介绍这款插件工具JRebel JRebel介绍: JRebel是一款JVM插件,它使得Java代码修改后不用重启项目,立即生效.IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启项目,才能生效,浪费时间浪费生命. 目前对于idea热部署最好的解决方案就是安装JRebel插件 s

随机推荐