簡體   English   中英

eclipse要求我在finally塊中使用try / catch包圍 - 可以禁用它嗎?

[英]eclipse asks me to surround with try/catch in finally block - possible to disable it?

在我的一個Java應用程序代碼中,我有一個try-catch-finally塊,其中try塊創建了一些輸入和輸出流,如果出現問題,我finally關閉所有先前打開的流。

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

但是Eclipse中的<stream>.close()行在此行的代碼中顯示錯誤“未處理的異常IOException”,並顯示解決方案是在finally塊中包含另一個try/catch ,這看起來很糟糕編程實踐,我不想在finally塊中。

我的問題是:是否可以在Eclipse中刪除此錯誤並僅在需要時使用try/catch而不是eclipse告訴我執行try/catch添加。 (因為我已經嘗試通過用if/else替換try/catch來避免異常)。

這不是Eclipse錯誤, 它是Java編譯器錯誤 Eclipse只是為您報告Java編譯錯誤。 由於代碼在沒有 try / catch子句的情況下無法編譯 ,因此無法 “關閉”。 它是Java中的一個安全功能,它會強制您處理通常拋出的異常。

方法在簽名中有例外。 例如, InputStream.close()拋出IOException,強制您在try / catch塊中處理它。

public void close() throws IOException {
    ...

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

我的問題是:是否有可能在eclipse中刪除此錯誤並在需要時使用try / catch而不是eclipse告訴我做try / catch add。

不,這是不可能的。

(因為我已經嘗試通過用if / else替換try / catch來避免異常)。

您通常不應嘗試使用if/else塊替換try/catch塊。 它們是具有不同目的的兩個不同特征。

例外是Java必不可少的功能。 閱讀並了解它。

正確地應該這樣做以確保我們嘗試關閉兩個流。

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

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

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

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

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

IOException不是您可以避免的,因為它可能由於您無法控制的情況而發生。 (網絡連接斷開,硬盤錯誤等)。 Eclipse完全正確, inputStream.close()outputStream.close()本身可能會拋出異常,你必須准備以某種方式處理它。 沒有辦法沉默這個錯誤,因為它不是Eclipse的挑剔; 您的代碼不是有效的Java代碼。

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

但是eclipse中的.close()行顯示錯誤,該行代碼中的Unhandled異常IOException,並顯示解決方案包含finally塊中的另一個try / catch,這對編程實踐來說是不好的,我不想在finally塊中。

close方法也可以拋出IOExceptions,因此你必須在finally塊中包含嵌套的try / catch子句,這是一個不幸的情況。

但是你真的無能為力。 你需要那些(丑陋的)finally塊來正確處理異常。

eclipse沒有任何問題。它只是表明你的代碼中有一個編譯錯誤 。你不能用if-esle替換try-catch,這里需要try catch。你需要這個try catch not因為輸入流可能為null你試試,否則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM