代码改变世界

[hyddd的FindBugs分析记录][M X OBL] Method may fail to clean up stream or resource

2009-02-16 14:55  hyddd  阅读(6796)  评论(0编辑  收藏  举报

[M X OBL] Method may fail to clean up stream or resource [OBL_UNSATISFIED_OBLIGATION]

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:

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.

 

这个BUG想说明的是:有些资源打开了,但在函数结束的时候却没有关闭。比如:数据库连接......

虽然JAVA有垃圾回收机制,但是,自己打开的资源需要自己手动关闭,否则有可能直到程序退出,JRE才会清理你打开的资源。这里FindBugs建议在try/finally里面关闭打开的资源,在关闭之前,还要判断资源是否为Null,或者再加一层异常捕获处理噢~

以下是一些可能关闭资源失败的例子:

-----------------------------------------------情况1-----------------------------------------

//
FileOutputStream fs = null;
try{
  fs 
= new FileOutputStream(clearTableFile);
  fs.close();    
//当出异常时候fs关闭失败,所以应该在finally中关闭
}
catch(){
//
}

-----------------------------------------------情况2-----------------------------------------

//
Properties props = new Properties();
try{
  props.store(
new FileOutputStream(configFile), configFile);  //new FileOutputStream(configFile)没有释放。
}
catch(){
  //
}

-----------------------------------------------情况3-----------------------------------------

  //
  FileOutputStream fs = new FileOutputStream(clearTableFile);
  //    (里没有做异常处理,如果中间出异常了,异常会抛往上层,这时fs就没能释放了。
  fs.close();    
  //