java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...
以下代碼段...
try
{
myFile = new FileInputStream("something.dat" );
...
}
catch ( IOExcpetion ioe )
{
...
}
finally
{
try
{
myFile.close();
}
catch ( Exception e )
{
...
}
}
...據(jù)我所知,最終正在關(guān)閉文件。 但是,為什么必須在其中包含另一個(gè)try / catch塊呢? 對(duì)我來說似乎很尷尬。 有沒有解決的辦法?
如果刪除最后一個(gè)try / catch塊并僅調(diào)用myFile.close(),會(huì)發(fā)生什么?您將看到為什么需要try的原因。
如果您認(rèn)為當(dāng)前的代碼很尷尬,請(qǐng)看一下AutoCloseable。
@GregHewgill謝謝您的回答。但是我認(rèn)為我不夠清楚。我在語法上知道這是必需的...但是看起來很尷尬。我想知道Java用這種方式設(shè)計(jì)它的原因。其次,我想知道是否有更方便的方式編寫以上內(nèi)容。
FileInputStream.close()引發(fā)IOException,因此您需要在myFile.close()周圍使用try-catch
@KarthikKalyanasundaram您能否請(qǐng)閱讀我上面的評(píng)論。謝謝。
更好的方法:對(duì)資源使用try,而不必在finally語句中使用try-catch
有兩個(gè)可能的原因:1.如果您的方法沒有引發(fā)IOException,則將需要捕獲它。 2.如果close方法確實(shí)引發(fā)異常,則catch將"吃掉"它,而不是引發(fā)該異常,并且將不會(huì)到達(dá)finally塊之后的代碼。
@morgano聽起來不錯(cuò)。您能否提供任何示例,或者可能提供指向我可以在線檢查的資源的鏈接?
@感激不盡,請(qǐng)?jiān)诹硪粋€(gè)問題中檢查此答案:stackoverflow.com/a/17739460/2164109,以獲取有關(guān)如何使用try資源進(jìn)行轉(zhuǎn)換的示例
@感激不盡,Karthiks的評(píng)論是一個(gè)很好的解釋。您需要try-catch,原因是FileInputStream.close()拋出IOException。您在哪里關(guān)閉文件完全取決于您。沒有寫任何內(nèi)容必須在finally中將其關(guān)閉。相反,即使主try塊中出現(xiàn)某些異常,文件也成功關(guān)閉是很方便的。
"我想知道Java用這種方式設(shè)計(jì)它的原因。" -因?yàn)槟梢栽谧詈笠徊街凶鋈魏问虑?#xff0c;而Java不知道您可能會(huì)做什么,而您可能會(huì)做的事情可能會(huì)導(dǎo)致另一個(gè)異常。最后一塊只是另一個(gè)代碼塊,沒有什么特別的(從塊本身內(nèi)部)。"我想知道是否有更方便的方法編寫以上內(nèi)容" – Java 7+中的try-with-resources
@morgano哇。太酷了。我希望您提供此解決方案,以便我可以接受。
@感謝沒有煩惱的人,現(xiàn)在知道我對(duì)您有幫助就足夠了;您可以將ankur-singhals答案作為接受的答案,如果您在其他問題中發(fā)現(xiàn)我的答案有用,只需投票:-)
@morgano謝謝你。經(jīng)您許可,我已選擇他的答案。
切記不要拋出HeatDeathOfTheUniverseException,因?yàn)樗粫?huì)被捕獲。它會(huì)永遠(yuǎn)坐在那里。
在FIleInputStream上調(diào)用close()方法必須被try catch子句包圍。 API方法本身會(huì)引發(fā)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包圍語句。
推薦這個(gè)
還談到Java7,您可以方便地處理相同的內(nèi)容
1.)捕獲多個(gè)異常
2.)try-with-resources語句
要了解IOException的原因,請(qǐng)?jiān)诖颂巺⒖碱愃频膯栴}。
你需要知道的事情
終于封鎖
該塊保證了在try或catch塊執(zhí)行之后,可以肯定地執(zhí)行此塊中編寫的代碼。它執(zhí)行是否發(fā)生異常。
為什么最后要寫close()
因?yàn)槲覀円P(guān)閉文件,而不管是否發(fā)生異常。
為什么close()需要try-catch
為此,您需要知道什么是CheckedExceptions。
簡(jiǎn)而言之,我想說CheckedExceptions是必須處理的那些,即您需要在try-catch塊中編寫它或聲明由throws關(guān)鍵字拋出。如果您看到close()方法的源代碼,您將知道它拋出了java.io.IOException(已檢查異常),因此您需要在try-catch中編寫它。
總結(jié)
以上是生活随笔為你收集整理的java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克:Neuralink 正开发视觉芯
- 下一篇: 中国电信内部人士:华为未独占卫星通讯功能