finally {if(inputStream!= null){inputStream.close();

时间:2016-08-21 11:49:58

标签: java bufferedreader ioexception

我不知道如何理解这一点:

<div class="checkbox">
  <input id="check1" type="checkbox" name="check">
  <label for="check1">Checklist One</label>
  <input id="check2" type="checkbox" name="check" checked>
  <label for="check2">Checklist two</label>
  <input id="check3" type="checkbox" name="check">
  <label for="check3">Checklist 3</label>
</div>

来自那个例子:

{
        if (inputStream **!= null**) {
            inputStream.close();
当有任何数据提供时,

inputStream正在关闭???

4 个答案:

答案 0 :(得分:3)

这意味着每当try块完成(成功与否)时,它都会尝试关闭inputStream块中的流(outputStreamfinally),但作为{{ 1}}阻止在创建tryBufferedReader的实例时可能会失败,您需要先检查它是否为PrintWriter,否则您将获得NPE。

您可以考虑使用try-with-resouces语句,以避免检查是否null并明确调用null,这样可以大大简化您的代码。

close()

答案 1 :(得分:1)

如果你问为什么这段代码在finally块中,那么,

这只是为了确保始终关闭inputStreamoutputStream,无论上面的代码是遇到还是没有遇到异常。

它有何不同。

区别在于任何例外情况。如果发生任何异常,那么它将确保在将异常返回到调用此方法的方法之前关闭两个流,而不是简单地返回。

因为始终执行java finally块,除非:

  • System.exit被称为
  • 或JVM崩溃

这是一种常见的做法 ,用于关闭finally块中的流,数据库或任何其他类似连接。这可确保连接始终关闭。因为如果他们不是最终阻止,并且系统不断遇到某些或其他Excpetion,那么它最终会用完连接。

答案 2 :(得分:0)

这只是为了避免空指针异常。仅当对象不是null时才调用这些函数。

简单来说,close函数仅在对象不为null时调用,否则如果您在具有空值的对象上调用close(),则会遇到null pointer exception

有趣的是finally的使用,无论是否有任何异常,都会被调用。

答案 3 :(得分:0)

当执行到达finally块时,首先检查inputstreamoutputstream是否为空,然后关闭两个流以释放资源。

请参阅链接以查看最终尝试:https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.2