Java 在InputStream#close()上使用finally关键字

Java 在InputStream#close()上使用finally关键字,java,inputstream,ioexception,try-catch-finally,Java,Inputstream,Ioexception,Try Catch Finally,基本上我不确定finally关键字的正确用法是什么,我只知道文本定义:保证代码会被执行,因为有时它不会。所以我希望我能得到一些关于这个特殊代码的指导: 另外,如果调用InputStream\close()的try catch块是不必要的 try { inputStream = entity.getContent(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); S

基本上我不确定finally关键字的正确用法是什么,我只知道文本定义:保证代码会被执行,因为有时它不会。所以我希望我能得到一些关于这个特殊代码的指导:

另外,如果调用
InputStream\close()
try catch
块是不必要的

try {
    inputStream = entity.getContent();

    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    StringBuilder sb = new StringBuilder();

    String line = null;

    while((line = br.readLine()) != null) {
        sb.append(line);
        sb.append("\n");
    }

    responseText = sb.toString();
} catch(IOException e) {
    e.printStackTrace();
} finally {
    if (inputStream != null) {
        try {
            inputStream.close();
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

无论异常是否源于
try
块,都将始终执行
finally
块。因此
finally
块被用作post活动。在用于关闭流的代码中。

finally块确保无论在尝试过程中发生什么(成功或异常),它都将始终运行。这通常在清理资源时使用,例如
InputStream
Socket

try-with-resource
范例会清理这个问题,但是会自动关闭那些
可以关闭的东西

try( InputStream inputStream = entity.getContent() )
{

}catch(Exception e)
{

}//declared resource in try automatically closed

您也可以使用

像这样:

try (YourResource resource) {
    //Todo...
} catch(YourSpecificException ex) {
    //Todo...
}
您在两篇论文之间声明的资源将在退出构建时自动关闭

您甚至可以一次性声明多个资源,用分号分隔它们。这一切都在上面的链接中,真的

try { 
  // Here the guarded area starts


  // Here the guarded area ends
} catch {
  // This block is executed when an exception occurs inside the guarded area

} finally {
  // This block is executed always before leaving try - catch - finally block
  // If there is an exception, then first catch block is executed and then finally
}

您拥有的
finally
块中的代码是用于关闭流的常用结构。如果在保护区内创建了一个流(
inputStream!=null
),那么最终块将关闭它。若在创建
inputStream
之前存在异常,则执行finally块,但因为
inputStream==null
,如果
语句不执行,则
语句中的代码。

try
块执行时,发生的任何异常都会将执行转移到
catch
块,然后转移到
finally
块。但是,如果try中没有发生异常,则在try to finally块之后,代码的执行将继续,在您的代码中,您试图使用IO资源,如果进程无法占用该资源,则可能会引发IO异常,然后将不会为
inputStream
分配任何引用。在任何情况下,如果资源被占用或为空,则必须找到一个finally块来关闭IO连接,记住,在任何情况下,finally都将始终执行,最好关闭与数据库和其他资源的连接,有时也释放内存。

我使用finally的时间通常是

  • 资源处理(IO、DB连接、套接字)
  • 并发性(锁释放、保证计数器更改)
  • 终结(
    尝试{}最终{super.finalize();}
  • 各国的记录保存

这是Apache HttpClient的代码吗?(entity.getContent()看起来很熟悉!)如果是这样,请尝试使用EntityUtils.consume(entity)来确保连接已释放。是的。我会试试的,我不喜欢。捕捉抛出的内容,让实际错误冒出来。@davidermann如果你指的是泛型异常,你是完全正确的,我同意。我只是把它作为一个普通的例子放在这里。事后看来,它可能发出了错误的信号。让我编辑一下。