0

可能重复:
声纳违规:“方法可能无法在异常时关闭流”</a>

我有一个使用 DataInputStream 的方法,代码如下:

DataInputStream in = null;
    ServletOutputStream outStream = null;
    FileInputStream fileIn = null;
    URL searchDirectory;
    try {
      searchDirectory = (java.net.URL) ctx.lookup("file/testHarnessDirectory");

      File file = new File(searchDirectory.getPath(), filename);
      int length = 0;
      outStream = response.getOutputStream();
      response.setContentType("application/octet-stream");
      response.setContentLength((int) file.length());

      response.setHeader("Content-Disposition", "attachement; filename=\"" + filename + "\"");
      byte[] byteBuffer = new byte[4096];
      fileIn = new FileInputStream(file);
      in = new DataInputStream(fileIn);

      while ((in != null) && ((length = in.read(byteBuffer)) != -1)) {
        outStream.write(byteBuffer, 0, length);
      }
      outStream.close();
      fileIn.close();
      in.close();
    }
    catch (NamingException e) {
      LOG.error("Exception", e);
      throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not download File", e);
    }
    catch (IOException e) {
      LOG.error("Exception", e);
      throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not submit File", e);
    }
    finally {
      try {
        if (fileIn != null) {
          fileIn.close();
        }
        if (in != null) {
          in.close();
        }
        if (outStream != null) {
          outStream.close();
        }
      }
      catch (IOException e) {
        LOG.error("Exception", e);
        throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not submit File", e);}}   

但是声纳给了我:不好的做法-方法可能无法在异常时关闭流。我查过这篇文章:Sonar 违规:“Method may fail to close stream on exception”,但对我来说似乎不完整。我可能是错的。谁能告诉我,关闭流的简单方法是什么?

4

1 回答 1

1

检查此部分:

 try {
    if (fileIn != null) {
      fileIn.close();
    }
    if (in != null) {
      in.close();
    }
    if (outStream != null) {
      outStream.close();
    }
  }

想一想,如果fileIn.close()失败会发生什么。其他两个流可能保持开放。请将它们放在单独的try-catch块中。例如

 try {
    if (fileIn != null) {
      fileIn.close();
    }
  }catch (IOException e) {
    LOG.error("Exception: Could not close file stream", e);
    //throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not close file stream", e);
  }
 try {
    if (in != null) {
      in.close();
    }
  }catch (IOException e) {
    LOG.error("Exception: Could not close in stream"", e);
    //throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not close in stream", e);
  }
 try {
    if (outStream != null) {
      outStream.close();
    }
  }
  }catch (IOException e) {
    LOG.error("Exception: Could not close out stream", e);
    //throw new CPSException(ErrorCode.FILE_HANDLING_EXCEPTION, "Could not close out stream", e);
  }
于 2012-10-26T00:15:21.103 回答