Java 在InputStream#close()上使用finally关键字
基本上我不确定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
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如果你指的是泛型异常,你是完全正确的,我同意。我只是把它作为一个普通的例子放在这里。事后看来,它可能发出了错误的信号。让我编辑一下。