为什么这个函数返回null outstream

时间:2009-11-25 10:21:06

标签: java

这个函数在循环中被调用时有时会将null作为outstream而其他时候没有..任何理由?我正在将流出写入文本文件,有时我得到空文本文件。为什么?如果我运行循环20次..我有时会在3个随机场合获得空文本文件,有时4或2个随机场合。我该怎么办?

public void decrypt(InputStream in, OutputStream out) {
  try {
    // Bytes read from in will be decrypted
    in = new CipherInputStream(in, dcipher);

    // Read in the decrypted bytes and write the cleartext to out
    int numRead = 0;
    while ((numRead = in.read(buf)) >= 0) {
      out.write(buf, 0, numRead);
    }
    out.close();
  }
  catch (java.io.IOException e) {
  }
}

4 个答案:

答案 0 :(得分:4)

我认为这是因为您正在关闭函数中的输出流。这样,循环的下一次迭代将尝试写入已经关闭的输出流。它将抛出一个IOException,但你忽略它。尝试在循环之后关闭输出流,而不是在方法中。

InputStream in = null;
OutputStream out = null;
try {
   in = Initialize input stream
   out = Initialize output stream
   for (int i = 0; i < 10; i++) {
      decrypt(in, out);
   }
}finally {
   try {
      if (out != null)
         out.close();
   }finally {
      if (in != null)
         in.close();
   }
}

答案 1 :(得分:3)

你绝对应该修复这部分代码:

catch (java.io.IOException e) {
}

并至少在那里进行一些记录。这样你就会发现为什么会遇到你所描述的问题。

答案 2 :(得分:3)

如果try块中的任何代码抛出异常,则会被忽略(因为catch子句中没有任何内容。

您可能想要:

  • 实际上在catch子句中做了一些事情(至少打印了异常的消息 - 试试e.printStackTrace()
  • 而不是在try块中进行out.close()调用,在catch块之后的finally子句中执行它(这样即使出现错误也会发生)
  • 另外,正如bruno所指出的,如果你总是重复使用相同的输出流进行解密的evey调用,你不应该在函数内部关闭它。但是你可能想在循环中刷新()它。

答案 3 :(得分:0)

“永远不要关闭你没有打开的东西” - 不知道这是否是一个黄金法则,但是当你关闭子程序中的资源时,它几乎总会导致麻烦 - 下次你需要关闭资源由于您更改了代码,因此它或资源未关闭...