以下代码段...
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中编写它。