2011-08-03 23 views
3

在我的一個Java應用程序的代碼中,我有一個try-catch-finally塊,其中try塊創建一些輸入和輸出流,如果出現錯誤,我關閉finally中的任何較早打開的流。eclipse要求我用try/catch在finally塊中包圍 - 可能禁用它嗎?

finally 
{ 
    if(inputStream != null) 
     inputStream.close(); 
    if(outputStream != null) 
     outputStream.close(); 
} 

<stream>.close()線在Eclipse中顯示錯誤「未處理的異常IOException異常」在這行代碼,並顯示該解決方案是包括在finally塊的其他的try/catch這似乎是壞的編程練習,我不想在最後阻止。

我的問題是:是否有可能在Eclipse中刪除此錯誤,並且僅在需要它時才使用try/catch,而不是eclipse告訴我執行try/catch添加。 (因爲我已盡力避免例外,因爲try/catch儘可能替換爲if/else)。

+1

有誰知道Java7中新的'Closeable'語法是否可以更優雅地處理這個問題? – Thilo

+0

ohh永遠不知道這一點,那麼我在哪裏可以獲得有關它的信息?你能分享一個鏈接嗎? – Ashutosh

+0

請參閱http://stackoverflow.com/questions/4092914/java-try-catch-finally-best-practices-while-acquiring-closing-resources和http://stackoverflow.com/questions/481446/throws-exception- in-finally-blocks –

回答

9

這不是Eclipse錯誤,這是Java編譯器錯誤。 Eclipse僅僅爲您報告Java編譯錯誤。沒有辦法將其關閉,因爲代碼不會編譯沒有try/catch子句。這是Java中的一項安全功能,可以強制您處理通常拋出的異常。

方法在其簽名中有例外。例如,InputStream.close()會拋出一個IOException,迫使您在try/catch塊中處理它。

public void close() throws IOException { 
    ... 

拋出異常是告訴程序必須處理的一個重要問題的一種方式。

我的問題是:是否有可能在eclipse中刪除這個錯誤,當我需要時使用try/catch,否則不是eclipse告訴我做try/catch添加。

不,這是不可能的。

(因爲我已經試圖通過用if/else替換try/catch儘可能避免異常)。

您一般不會嘗試用if/else塊代替try/catch塊。它們是兩個截然不同的目的特徵。

異常是一項重要的Java功能。 Read about it並理解它。

+0

多數民衆贊成在良好的功能,但我認爲裏面最後阻止,如果我添加try-catch,那麼它會像嵌套try-catch。通常最終應該做簡單的事情,並結束嘗試開始的事情,這就像糟糕的編碼習慣。 – Ashutosh

6

適當地這應該做這樣的事情,以確保我們試圖關閉這兩個流。

finally 
{ 
    try { 
    if(inputStream != null) 
     inputStream.close(); 
    } 
    catch(Exception e) 
    { /* Ignore */ } 

    try { 
    if(outputStream != null) 
     outputStream.close(); 
    } 
    catch(Exception e) 
    { /* Ignore */ } 
} 
+0

是的,我正是這樣做,因爲你在上面寫道,但我不喜歡試着抓到裏面。但是,似乎我無法避免它。 – Ashutosh

+0

Java很醜。一個'使用'塊早該過期了 –

2

IOException是不是你能避免,因爲它可能會因爲你的控制範圍之外的情況發生。 (網絡連接中斷,硬盤錯誤等)。 Eclipse是完全正確的,inputStream.close()outputStream.close()本身可能會拋出異常,並且你必須準備好以某種方式處理。沒有辦法來消除這個錯誤,因爲它不是Eclipse的挑剔;您的代碼無法像現在這樣有效的Java代碼。

你可以聲明你的函數throws IOException並委託處理異常給調用者,或者你必須咬住子彈並自己處理(可能忽略)IOException。我認爲在Apache Commons的IOUtils庫中有一個實用函數,它封裝了這個邏輯,這將使你的代碼變得更加清晰(並隱藏了一個事實,即你正在默默地忽略一個IOException)。

+0

ohh,我明白了,如果它那樣的話那麼我必須使圍繞try/catch來關閉方法 – Ashutosh

4

如果您不在意處理異常,請查看Apache commons io庫。

org.apache.commons.io.IOUtils.closeQuietly(inputstream) 

也適用於輸出流,作家和讀者。

+0

我沒有得到這個解決方案,你的意思是我可以使用上面的包來壓制在最後使用try-catch?對不起,對於任何錯誤的問題,我很少新的日食。 – Ashutosh

+0

就是這樣,這個圖書館會安靜地關閉流,而不會拋出任何異常。你可以從http://commons.apache.org/io/下載它。它還有許多其他有用的功能,例如將輸入流/閱讀器複製到輸出流/寫入器。 就像其他人所說的,這不是你遇到的Eclipse問題,而是一個有效的Java錯誤。但是由於關閉流是否引發錯誤通常是無關緊要的,因此該庫會爲您提供完全隱藏的選項。 –

0

但在Eclipse中.close()行顯示錯誤未處理的異常IOException異常在這行代碼,並顯示解決方案,包括另一個try/catch的finally塊是壞的編程習慣,我不希望在終於阻止。

事實上,close方法也會拋出IOExceptions,所以你必須在finally塊中嵌套try/catch子句,這是一個不幸的情況。

但是,對此你確實沒有什麼可以做的。你需要這些(醜陋的)最後塊來正確處理異常。

0

沒有什麼錯eclipse.It只是顯示你有你的code.you一個編譯錯誤不能與IF-esle和這裏需要嘗試catch.You需要這種嘗試捕捉不會因爲更換的try-catch輸入流可能是空的,如果你嘗試在其他地方。

相關問題