Java 为什么此函数返回null outstream

Java 为什么此函数返回null outstream,java,Java,在循环中调用此函数时,有时会将null作为outstream,而有时则不会。。有什么原因吗?我正在将扩展流写入文本文件,有时会得到空文本文件。为什么?如果我运行循环20次。。我有时会在3个随机场合,有时4或2个随机场合得到空文本文件。我该怎么办 public void decrypt(InputStream in, OutputStream out) { try { // Bytes read from in will be decrypted in = new Cipher

在循环中调用此函数时,有时会将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) {
  }
}

我认为这是因为您正在关闭函数中的输出流。这样,循环的下一次迭代将尝试写入已关闭的输出流。它将抛出一个
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();
   }
}
InputStream in=null;
OutputStream out=null;
试一试{
in=初始化输入流
out=初始化输出流
对于(int i=0;i<10;i++){
解密(输入、输出);
}
}最后{
试一试{
if(out!=null)
out.close();
}最后{
if(in!=null)
in.close();
}
}

我认为发生这种情况是因为您正在关闭函数中的输出流。这样,循环的下一次迭代将尝试写入已关闭的输出流。它将抛出一个
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();
   }
}
InputStream in=null;
OutputStream out=null;
试一试{
in=初始化输入流
out=初始化输出流
对于(int i=0;i<10;i++){
解密(输入、输出);
}
}最后{
试一试{
if(out!=null)
out.close();
}最后{
if(in!=null)
in.close();
}
}

“永远不要关闭您尚未打开的资源”-不知道这是否是一条黄金法则,但当您关闭子例程中的资源时,它几乎总是会导致问题-或者在下次需要时关闭资源,或者由于您更改了代码而未关闭资源…

“永远不要关闭您尚未打开的资源”-不知道这是否是一条金科玉律,但当您关闭子例程中的资源时,它几乎总是会导致麻烦-要么下次需要时关闭资源,要么因为更改了代码而未关闭资源…

您肯定应该修复代码的这一部分:

catch (java.io.IOException e) {
}

至少在那里做一些记录。这样,您就可以找到出现所述问题的原因。

您肯定应该修复代码的这一部分:

catch (java.io.IOException e) {
}

至少在那里做一些记录。通过这种方式,您将发现出现所述问题的原因。

如果try块中的任何代码引发异常,它将被忽略(因为catch子句中没有任何内容)

您可能希望:

  • 在catch子句中实际执行一些操作(至少打印异常消息-尝试
    e.printStackTrace()
  • 不要在try块中调用
    out.close()
    ,而是在catch块后的
    finally
    子句中调用(这样即使出现错误也会发生)
  • 另外,正如bruno所指出的,如果每次调用decrypt时都重复使用同一个输出流,那么不应该在函数内部关闭它,但是可能需要在循环内部刷新()它

如果try块中的任何代码引发异常,它将被忽略(因为catch子句中没有任何内容)

您可能希望:

  • 在catch子句中实际执行一些操作(至少打印异常消息-尝试
    e.printStackTrace()
  • 不要在try块中调用
    out.close()
    ,而是在catch块后的
    finally
    子句中调用(这样即使出现错误也会发生)
  • 另外,正如bruno所指出的,如果每次调用decrypt时都重复使用同一个输出流,那么不应该在函数内部关闭它,但是可能需要在循环内部刷新()它

您捕获异常,但不在控制台上打印。在控制台上显示异常。前面给出的4个答案都没有解决问题。我不知道如何共享整个eclipse项目以找到问题的根源。有人可以进行远程登录吗?您捕获异常,但不在控制台上打印。在控制台上显示异常ole.给出的前4个答案都没有解决问题。我不知道如何共享整个eclipse项目以找到问题的根源..有人可以远程登录吗?我这样做了,并注释掉了。关闭函数..但没有任何更改..如果可能,你可以远程登录我的计算机..因为我不知道如何共享整个eclipse项目。你不能发布调用decrypt并创建输入/输出流的代码吗?我这样做了,并注释掉了。关闭函数..但没有更改..如果可能,你可以远程登录到我的计算机..因为我不知道如何共享整个eclipse项目。你不能发布调用decrypt的代码吗是否正在创建输入/输出流?