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中編寫它。
總結
以上是生活随笔為你收集整理的java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克:Neuralink 正开发视觉芯
- 下一篇: oracle存储技术,oracle存储体