前言

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 明显的无限迭代循环,将导致堆栈溢出.

---------------------

作者:飞奔的小付 原文:https://blog.csdn.net/feibendexiaoma/article/details/72821781 

findbugs使用_FindBugs,一个帮你找bug的IDEA插件相关推荐

  1. 帮我找BUG 有功者赏看主公洗澡机会

    各位上仙,本人刚入门,写了个c primer plus的课后编程练习,但总觉着哪里有点问题,请各位上仙帮瞧瞧. #include <stdio.h> #include <stdlib ...

  2. android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  3. Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)

    在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降.那么怎么才能找出这些埋在程序里 ...

  4. python什么工作好找女朋友_程序员,三分钟教你用 Python 帮你找一个女朋友

    原标题:程序员,三分钟教你用 Python 帮你找一个女朋友 什么是单身税? 单身税的历史可以追溯到2015年韩国的新政, 低生育率逼得韩国产生了这一政策. 现在我国也要实行这一政策, 很多单身狗就接 ...

  5. 客户花钱雇黑客,竟是为Zoom找bug:风口浪尖的视频会议No.1,安全问题如此魔幻...

    白交 鱼羊 发自 凹非寺 量子位 报道 | 公众号 QbitAI 客户花钱找黑客,帮你产品找Bug-- 这样的客户哪里找?这样的产品又究竟有怎样的福报? Zoom,疫情之下最火爆的视频会议公司,又上演 ...

  6. 苏宁回应股权质押给淘宝;日本政府用 AI 帮民众找对象;魅族回应 “暗中给手机植入木马” | EA周报...

    EA周报 2020年12月11日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 周报看点 1.阿里云发布冷链食品追溯系统解决方案,食品用上"电子身份证&qu ...

  7. 帮奶牛找对象?华为云AI黑科技大揭秘

    AI可以用来做什么? 华为云BU总裁郑叶表示,"AI不是一个独立的产品,而是一种 '基本生产力',适用于大部分经济活动,将改变每一个行业.企业和职业,产生倍增效应." 于是,华为的 ...

  8. 如何用人工智能帮你找论文?

    本文转自微信公众号:芝兰玉树 作者 | 王树义 传统的关键词检索论文,浩如烟海的结果让你无所适从?试试人工智能检索引擎.根据你的研究兴趣和偏好,便捷而靠谱帮你找论文. ▌烦恼 进入一个新领域,读论文是 ...

  9. Delphi XE 10.4 FMX ListView 一个不易察觉的 BUG

    Delphi XE 10.4 FMX ListView 一个不易察觉的 BUG 在使用 ListView DynamicAppearance 时发现非常强大,可以加很多东西,但没有发现复选框(哪位大佬 ...

最新文章

  1. 关于 MongoDB 与 SQL Server 通过本身自带工具实现数据快速迁移 及 注意事项 的探究...
  2. 动态规划——最长公共子序列(LCS)
  3. 6.LibSVM核函数
  4. mysql tdh_socket_thread_num_TDH_Socket的一些性能对比数据
  5. switch一定比if else好用吗
  6. 找不到所需的 Adobe Flash Player 调试器版本
  7. visio2016下载以及永久激活
  8. java中 this详解
  9. 微信小程序 video 视频 组件
  10. dos命令大全 基础命令+网络的常用命令
  11. 极致体验,揭晓抖音背后的音视频技术
  12. Windows 中的 UAC 用户账户控制
  13. 餐桌 (Standard IO)
  14. 小程序仿学习强国填空题
  15. sublime_字体更换
  16. python数据可视化创建_【Python数据可视化】创建3D可视化图表
  17. C++ 栈和队列 容器适配器
  18. 一个人窝在摇椅里乘凉 我承认这样真的很安详 和楼下老爷爷一样
  19. 【实用】一套专业的人员定位系统应该如何选择硬件设备?
  20. BAV99W 器件的作用

热门文章

  1. mysql语法题_mysql数据库题语法练习
  2. 深度学习之 Cascade R-CNN
  3. Python 自动生成环境依赖包 requirements
  4. Golang语言基础课件
  5. Django中的class Meta知识点
  6. Vim的基本操作总结
  7. 汇编为什么分段执行总是执行不了_iOS汇编教程(六)CPU 指令重排与内存屏障...
  8. linux 最强shell,最牛B 的 Linux Shell 命令(一)
  9. java 空指针异常之一。 新建的一个对象没有NEW 导致其SET属性时报错
  10. 做个流量站-聚茶吧, 汇聚茶的地方