Findbugs的OBL处理方法

原创 2015年11月12日 10:53:33

最近在整代码的持续集成,findbugs进行代码的静态检查。其中一个findbugs警告解决了好久,先看示例代码:

private void copyDataBase() {
        InputStream myInput = null;
        OutputStream myOutput = null;
        try {
            String inFileName = "";//your local db path
            // Open your local db as the input stream
            myInput = new FileInputStream(inFileName);
            // Path to the just created empty db
            String outFileName = ""//the new db file u want to create;
            // Open the empty db as the output stream
            myOutput = new FileOutputStream(outFileName);
            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            // Close the streams
            myOutput.flush();
            myOutput.close();
            myOutput = null;
            myInput.close();
            myInput = null;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(myInput != null) {
                    myInput.close();
                }
                if(myOutput != null) {
                    myOutput.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            myInput = null;
            myOutput = null;
        }
    }

首先来看findbugs的警告:

OBL_UNSATISFIED_OBLIGATION, Priority: Normal

OBL: copyDataBase() may fail to clean up java.io.OutputStream

This method may fail to clean up (close, dispose of) a stream,
database object, or other resource requiring an explicit cleanup
operation.

In general, if a method opens a stream or other resource, the method
should use a try/finally block to ensure that the stream or resource
is cleaned up before the method returns.

This bug pattern is essentially the same as the **OS_OPEN_STREAM and
ODR_OPEN_DATABASE_RESOURCE** bug patterns, but is based on a different
(and hopefully better) static analysis technique. We are interested is
getting feedback about the usefulness of this bug pattern. To send
feedback, either: •send email to findbugs@cs.umd.edu •file a bug
report: http://findbugs.sourceforge.net/reportingBugs.html

In particular, the false-positive suppression heuristics for this bug
pattern have not been extensively tuned, so reports about false
positives are helpful to us.

See Weimer and Necula, Finding and Preventing Run-Time Error Handling
Mistakes, for a description of the analysis technique.

这里提示应该用try/finally来确保stream的clean up,但函数里也使用了finally,判断stream是否释放了,为什么还是报这样的警告呢?

然后再尝试在catch中也加入对stream的处理

 catch (IOException e) {
        e.printStackTrace();
        try {
            if(myInput != null) {
                myInput.close();
            }
            if(myOutput != null) {
                myOutput.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        myInput = null;
        myOutput = null;
    }

然并卵,还是报同样的警告。
最后仔细研究了findbugs的提示“use a try/finally block”,是不是这里不能使用catch了呢?就尝试在函数抛出异常到外部处理了

private void copyDataBase() throws IOException {
        InputStream myInput = null;
        OutputStream myOutput = null;
        try {
            String inFileName = "";//your local db path
            // Open your local db as the input stream
            myInput = new FileInputStream(inFileName);
            // Path to the just created empty db
            String outFileName = ""//the new db file u want to create;
            // Open the empty db as the output stream
            myOutput = new FileOutputStream(outFileName);
            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }
            // Close the streams
            myOutput.flush();
            myOutput.close();
            myOutput = null;
            myInput.close();
            myInput = null;
        } finally {
            try {
                if(myInput != null) {
                    myInput.close();
                }
                if(myOutput != null) {
                    myOutput.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            myInput = null;
            myOutput = null;
        }
    }

重新findbugs检查下,发现不再报警告了。
可能findbugs的检查机制是只能在finally中处理stream的异常吧,所以这里不能出现catch,异常抛出外部处理当然就检查不到了。
但是findbugs这里也提了,这个警告可能也不需要调整修改,可能是错误的建议,可以反馈给findbugs。

In particular, the false-positive suppression heuristics for this bug
pattern have not been extensively tuned, so reports about false
positives are helpful to us.

这里仅分享下此findbugs警告的修改方法,不强制说一定要修改此警告。

转载请声明原文地址:
http://blog.csdn.net/sagittarius1988/article/details/49795795

版权声明:本文为博主原创文章,未经博主允许不得转载。

FINDBUGS错误: OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE

拷贝文件的函数,之前的写法: 039   // 复制文件 040   public static void copyfile(File from, String to) thr...

FindBugs Report安全代码检查工具问题解析

1、LI_LAZY_INIT_UPDATE_STATIC:Incorrect lazy initialization and update of static field Thismethod con...
  • wwbmyos
  • wwbmyos
  • 2016年01月20日 20:14
  • 5385

findbugs 错误分析

findbugs 错误分析日志 findbugs 出错类型及对应解释   终于 我们又开始使用FINDBUGS来检测代码的问题了 但因没又中文版和网上错误分析实际很少 所以自己边处理BUG边写文档 ...

findbugs 错误分析

findbugs 错误分析日志 findbugs 出错类型及对应解释 终于 我们又开始使用FINDBUGS来检测代码的问题了 但因没又中文版和网上错误分析实际很少 所以自己边处理BUG边写文档  ...
  • sjf8013
  • sjf8013
  • 2012年06月26日 17:03
  • 9579

Java SE-基本数据类型对应包装类

包装类 Java是面向对象的编程语言,包装类的出现更好的体现这一思想。 其次,包装类作为类是有属性有方法的,功能比基本数据类型要强大。 基本数据类型 对应的包装类 byte Byte...

FindBugs规则整理-下

86.RV: Method ignores return value (RV_RETURN_VALUE_IGNORED) 该方法的返回值应该进行检查。这种警告通常出现在调用一个不可变对象的方法,认为...

FindBugs错误描述和解决方法

FindBugs常见错误描述和解决方法 (一) [DLS_DEAD_LOCAL_STORE] 描述: Dead store to 未使用的局部变量 解决方法:局部变量定义后未使用;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Findbugs的OBL处理方法
举报原因:
原因补充:

(最多只允许输入30个字)