日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/9/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以下代碼段...

try

{

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

...

}

catch ( IOExcpetion ioe )

{

...

}

finally

{

try

{

myFile.close();

}

catch ( Exception e )

{

...

}

}

...據(jù)我所知,最終正在關(guān)閉文件。 但是,為什么必須在其中包含另一個try / catch塊呢? 對我來說似乎很尷尬。 有沒有解決的辦法?

如果刪除最后一個try / catch塊并僅調(diào)用myFile.close(),會發(fā)生什么?您將看到為什么需要try的原因。

如果您認(rèn)為當(dāng)前的代碼很尷尬,請看一下AutoCloseable。

@GregHewgill謝謝您的回答。但是我認(rèn)為我不夠清楚。我在語法上知道這是必需的...但是看起來很尷尬。我想知道Java用這種方式設(shè)計(jì)它的原因。其次,我想知道是否有更方便的方式編寫以上內(nèi)容。

FileInputStream.close()引發(fā)IOException,因此您需要在myFile.close()周圍使用try-catch

@KarthikKalyanasundaram您能否請閱讀我上面的評論。謝謝。

更好的方法:對資源使用try,而不必在finally語句中使用try-catch

有兩個可能的原因:1.如果您的方法沒有引發(fā)IOException,則將需要捕獲它。 2.如果close方法確實(shí)引發(fā)異常,則catch將"吃掉"它,而不是引發(fā)該異常,并且將不會到達(dá)finally塊之后的代碼。

@morgano聽起來不錯。您能否提供任何示例,或者可能提供指向我可以在線檢查的資源的鏈接?

@感激不盡,請?jiān)诹硪粋€問題中檢查此答案:stackoverflow.com/a/17739460/2164109,以獲取有關(guān)如何使用try資源進(jìn)行轉(zhuǎn)換的示例

@感激不盡,Karthiks的評論是一個很好的解釋。您需要try-catch,原因是FileInputStream.close()拋出IOException。您在哪里關(guān)閉文件完全取決于您。沒有寫任何內(nèi)容必須在finally中將其關(guān)閉。相反,即使主try塊中出現(xiàn)某些異常,文件也成功關(guān)閉是很方便的。

"我想知道Java用這種方式設(shè)計(jì)它的原因。" -因?yàn)槟梢栽谧詈笠徊街凶鋈魏问虑?#xff0c;而Java不知道您可能會做什么,而您可能會做的事情可能會導(dǎo)致另一個異常。最后一塊只是另一個代碼塊,沒有什么特別的(從塊本身內(nèi)部)。"我想知道是否有更方便的方法編寫以上內(nèi)容" – Java 7+中的try-with-resources

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

@感謝沒有煩惱的人,現(xiàn)在知道我對您有幫助就足夠了;您可以將ankur-singhals答案作為接受的答案,如果您在其他問題中發(fā)現(xiàn)我的答案有用,只需投票:-)

@morgano謝謝你。經(jīng)您許可,我已選擇他的答案。

切記不要拋出HeatDeathOfTheUniverseException,因?yàn)樗粫徊东@。它會永遠(yuǎn)坐在那里。

在FIleInputStream上調(diào)用close()方法必須被try catch子句包圍。 API方法本身會引發(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包圍語句。

推薦這個

還談到Java7,您可以方便地處理相同的內(nèi)容

1.)捕獲多個異常

2.)try-with-resources語句

要了解IOException的原因,請?jiān)诖颂巺⒖碱愃频膯栴}。

你需要知道的事情

終于封鎖

該塊保證了在try或catch塊執(zhí)行之后,可以肯定地執(zhí)行此塊中編寫的代碼。它執(zhí)行是否發(fā)生異常。

為什么最后要寫close()

因?yàn)槲覀円P(guān)閉文件,而不管是否發(fā)生異常。

為什么close()需要try-catch

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

簡而言之,我想說CheckedExceptions是必須處理的那些,即您需要在try-catch塊中編寫它或聲明由throws關(guān)鍵字拋出。如果您看到close()方法的源代碼,您將知道它拋出了java.io.IOException(已檢查異常),因此您需要在try-catch中編寫它。

總結(jié)

以上是生活随笔為你收集整理的java 文件流关闭 finally,关于java:为什么需要在“ finally”内关闭文件,而仍将其嵌入在“ try / catch”块内?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。