java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...

以下代码段...

try

{

myFile = new FileInputStream("something.dat" );

...

}

catch ( IOExcpetion ioe )

{

...

}

finally

{

try

{

myFile.close();

}

catch ( Exception e )

{

...

}

}

...据我所知,最终正在关闭文件。 但是,为什么必须在其中包含另一个try / catch块呢? 对我来说似乎很尴尬。 有没有解决的办法?

如果删除最后一个try / catch块并仅调用myFile.close(),会发生什么?您将看到为什么需要try的原因。

如果您认为当前的代码很尴尬,请看一下AutoCloseable。

@GregHewgill谢谢您的回答。但是我认为我不够清楚。我在语法上知道这是必需的...但是看起来很尴尬。我想知道Java用这种方式设计它的原因。其次,我想知道是否有更方便的方式编写以上内容。

FileInputStream.close()引发IOException,因此您需要在myFile.close()周围使用try-catch

@KarthikKalyanasundaram您能否请阅读我上面的评论。谢谢。

更好的方法:对资源使用try,而不必在finally语句中使用try-catch

有两个可能的原因:1.如果您的方法没有引发IOException,则将需要捕获它。 2.如果close方法确实引发异常,则catch将"吃掉"它,而不是引发该异常,并且将不会到达finally块之后的代码。

@morgano听起来不错。您能否提供任何示例,或者可能提供指向我可以在线检查的资源的链接?

@感激不尽,请在另一个问题中检查此答案:stackoverflow.com/a/17739460/2164109,以获取有关如何使用try资源进行转换的示例

@感激不尽,Karthiks的评论是一个很好的解释。您需要try-catch,原因是FileInputStream.close()抛出IOException。您在哪里关闭文件完全取决于您。没有写任何内容必须在finally中将其关闭。相反,即使主try块中出现某些异常,文件也成功关闭是很方便的。

"我想知道Java用这种方式设计它的原因。" -因为您可以在最后一步中做任何事情,而Java不知道您可能会做什么,而您可能会做的事情可能会导致另一个异常。最后一块只是另一个代码块,没有什么特别的(从块本身内部)。"我想知道是否有更方便的方法编写以上内容" – Java 7+中的try-with-resources

@morgano哇。太酷了。我希望您提供此解决方案,以便我可以接受。

@感谢没有烦恼的人,现在知道我对您有帮助就足够了;您可以将ankur-singhals答案作为接受的答案,如果您在其他问题中发现我的答案有用,只需投票:-)

@morgano谢谢你。经您许可,我已选择他的答案。

切记不要抛出HeatDeathOfTheUniverseException,因为它不会被捕获。它会永远坐在那里。

在FIleInputStream上调用close()方法必须被try catch子句包围。 API方法本身会引发IOException异常。 IOException也是受检查的异常,因此我们需要处理此异常。

检查异常

Checked exceptions are checked at compile-time. It means if a method

is throwing a checked exception then it should handle the exception

using try-catch block or it should declare the exception using throws

keyword, otherwise the program will give a compilation error. It is

named as checked exception because these exceptions are checked at

Compile time.

通过API,

/**

* Closes this file input stream and releases any system resources

* associated with the stream.

*

*

If this stream has an associated channel then the channel is closed

* as well.

*

* @exception  IOException  if an I/O error occurs.

*

* @revised 1.4

* @spec JSR-51

*/

public void close() throws IOException {

}

由于close(),方法抛出IOException,因此您需要re-throw the same或用try/catch包围语句。

推荐这个

还谈到Java7,您可以方便地处理相同的内容

1.)捕获多个异常

2.)try-with-resources语句

要了解IOException的原因,请在此处参考类似的问题。

你需要知道的事情

终于封锁

该块保证了在try或catch块执行之后,可以肯定地执行此块中编写的代码。它执行是否发生异常。

为什么最后要写close()

因为我们要关闭文件,而不管是否发生异常。

为什么close()需要try-catch

为此,您需要知道什么是CheckedExceptions。

简而言之,我想说CheckedExceptions是必须处理的那些,即您需要在try-catch块中编写它或声明由throws关键字抛出。如果您看到close()方法的源代码,您将知道它抛出了java.io.IOException(已检查异常),因此您需要在try-catch中编写它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值