eclipse插件FindBugs各种bug描述及解决方法

2024-01-10 16:32

本文主要是介绍eclipse插件FindBugs各种bug描述及解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 )原代码如下:

protected String[] a = null;

public void test(String[] str){

    this.a = str;

}

findbugs描述为:

This code stores a reference to an externally mutable object into the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.

网上翻译如下:

可能因使引用可指向多个对象而暴露内部存储结构。 
这代码使一个指向外部多个对象的引用指向了一个内部对象存储地址。 
如果实例被未被信任代码访问或多个对象发生了未经检查的改变就会危及安全性或其它重要属性, 
你需要去做一些不同的事情。存储一个对象的拷贝在许多情况下会是一个更好的方法。

修改如下:

public void test(String[] str){

 

    if(str!=null)

    this.a = str.clone();

}

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

2 )在bean中定义数组类型的bug

[参考]http://topic.csdn.net/u/20080115/20/c8893ce0-5546-4762-97bb-9b00d10885cc.html

原代码:

private String[] name; 

public String[] getName() { 
return name; 


public void setName(String[] name) { 
this.name = name; 
}

bug描述:

[EI] May expose internal representation by returning reference to mutable object [EI_EXPOSE_REP]

解决:

private String[] name; 

public String[] getName() { 
String[] temp = name; 
return temp; 


public void setName(String[] name) { 
String[] temp = name; 
this.name = temp; 
}

说明:

    所有容器类型如ArrayList和数组类型,如果你都自动生成get set,都会有这个警告。 
    这个警告的主要目的是:一般的get set直接把此对象中某一容器的引用放到外部,可以随便更改,违反了封装的原则,至于那个temp的方法,由于不是直接对内部容器进行操作,故没有警告,但没有实际意义,自己知道即可。

 

Returning a reference to a mutable object value stored in one of the object's fields exposes the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would compromise security or other important properties, you will need to do something different. Returning a new copy of the object is better approach in many situations.

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

3) 序列化问题

源码:

private Obj[] obj;

public void getObj(){

Obj[] tep = obj;

return tep;

}

public Obj[] setObj(Obj[] o){

Obj[] tep = o;

this.obj = tep;

}

bug描述:

This Serializable class defines a non-primitive instance field which is neither transient, Serializable, or java.lang.Object, and does not appear to implement the Externalizable interface or the readObject() and writeObject() methods. Objects of this class will not be deserialized correctly if a non-Serializable object is stored in this field.

修改:

public class Obj implements Serializable {

...

}

 

4 ) new Integer(int) 和 Integer.valueOf(int)  

bug描述:

[Bx] Method invokes inefficient Number constructor; use static valueOf instead [DM_NUMBER_CTOR]

Using new Integer(int) is guaranteed to always result in a new object whereas Integer.valueOf(int) allows caching of values to be done by the compiler, class library, or JVM. Using of cached values avoids object allocation and the code will be faster.

说明:

[参考]http://www.cnblogs.com/hyddd/articles/1391318.html

FindBugs推荐使用Integer.ValueOf(int)代替new Integer(int),因为这样可以提高性能。如果当你的int值介于-128~127时,Integer.ValueOf(int)的效率比Integer(int)快大约3.5倍。

下面看看JDK的源码,看看到Integer.ValueOf(int)里面做了什么优化:

public   static  Integer valueOf( int  i) {
  
final   int  offset  =   128 ;
  
if  (i  >=   - 128   &&  i  <=   127 ) {  //  must cache
     return  IntegerCache.cache[i  +  offset];
   }
  
return   new  Integer(i);




private   static   class  IntegerCache {
  
private  IntegerCache(){}
    
  
static   final  Integer cache[]  =   new  Integer[ - ( - 128 +   127   +   1 ];
  
static  {
  
for ( int  i  =   0 ; i  <  cache.length; i ++ )
      cache 
=   new  Integer(i  -   128 );
   }

从源代码可以知道,ValueOf对-128~127这256个值做了缓存(IntegerCache),如果int值的范围是:-128~127,在ValueOf(int)时,他会直接返回IntegerCache的缓存给你。

 

所以你会看到这样的一个现象:

public   static   void  main(String []args) {
      Integer a 
=   100 ;
      Integer b 
=   100 ;
      System.out.println(a
== b);

      Integer c 
=   new  Integer( 100 );
      Integer d 
=   new  Integer( 100 );
      System.out.println(c
== d);
}

结果是:

true
false

因为:java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);,所以a和b得到都是一个Cache对象,并且是同一个!而c和d是新创建的两个不同的对象,所以c自然不等于d。

 

再看看这段代码:

 

public   static   void  main(String args[])  throws  Exception{
         Integer a 
=   100 ;
         Integer b 
=  a;
         a 
=  a  +   1 ;  //或者a++;
         System.out.println(a
== b);
}

结果是:false

 

因为在对a操作时(a=a+1或者a++),a重新创建了一个对象,而b对应的还是缓存里的100,所以输出的结果为false。

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

5) toString() 和 String

源码:

return a.toString();

bug描述

[Dm] Method invokes toString() method on a String [DM_STRING_TOSTRING]
Calling String.toString() is just a redundant operation. Just use the String.

修改为:

return (String) a;

***************************************************************************

未解决bug

1、

[DMI] Code contains a hard coded reference to an absolute pathname [DMI_HARDCODED_ABSOLUTE_FILENAME]

This code constructs a File object using a hard coded to an absolute pathname (e.g., new File("/home/dannyc/workspace/j2ee/src/share/com/sun/enterprise/deployment");

这篇关于eclipse插件FindBugs各种bug描述及解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/591406

相关文章

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

解决RocketMQ的幂等性问题

《解决RocketMQ的幂等性问题》重复消费因调用链路长、消息发送超时或消费者故障导致,通过生产者消息查询、Redis缓存及消费者唯一主键可以确保幂等性,避免重复处理,本文主要介绍了解决RocketM... 目录造成重复消费的原因解决方法生产者端消费者端代码实现造成重复消费的原因当系统的调用链路比较长的时

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of