2016-08-14 22 views
1

下午好,Android Java - 如何在finally中拋出一個try-catch-finally,全部在抽象類中進行重構?

我目前的代碼工作的:

https://github.com/kevinsawicki/http-request

我試圖重構適用於清除所有的Android工作室警告之前,我將其包含在代碼我正在進行一個項目。目前,我用下面的嵌套的抽象類工作:

/////////////////////////////////////////////////////////////////////////////////////////////// 
protected static abstract class Operation<V> implements Callable<V> { 

    protected abstract V run() throws HttpRequestException, IOException; 

    protected abstract void done() throws IOException; 

    public V call() throws HttpRequestException { 
     Log.d(TAG, "in HttpRequest nested class Operation call"); 
     boolean thrown = false; 

     try { 
      return run(); 
     } catch (HttpRequestException e) { 
      thrown = true; 
      throw e; 
     } catch (IOException e) { 
      thrown = true; 
      throw new HttpRequestException(e); 
     } finally { 
      try { 
       done(); 
      } catch (IOException e) { 
       if (!thrown) { 
        throw new HttpRequestException(e); 
       } 
      } 
     } 
    } 
} // end Operation 

這產生以下警告對於具有finally塊內拋出:

enter image description here

我一直在尋找這個一段時間,但我似乎無法找到一種方法來排除此警告。我沒有看到這對方的回答:

throws Exception in finally blocks

但是我真的喜歡不引入其他功能。如果我要引入一個closeQuietly函數,是否會進入上面列出的嵌套類的內部或外部?請指教,謝謝!

回答

4

這只是一個警告。如果你讀了解釋它說(重點煤礦)

雖然偶爾預期,這樣throw語句可能掩蓋拋出的異常和巨大複雜的調試。

如果你需要做的,然後去做,但只要確定它實際上是你想要做的和理解的影響(這是類似於說什麼「你真的要做到這一點?」 )。並非所有IntelliJ的警告都可以消除。基於

編輯跟進:你要問自己,如果你的框架需要拋出該異常在finally塊。你可以實現一個類似的方法來鏈接沒有使用另一個函數的鏈接(只需用日誌語句替換throw語句),但這可能不是理想的。這完全取決於潛在的錯誤條件。

如果,例如,你希望done()碰到的問題,只要您之前已接受IOExceptionHttpRequestException,那麼你可能不需要扔在finally塊什麼(只要登錄吧)。但是,如果您需要確保提醒用戶出現問題時嘗試清理,那麼您確實需要拋出,並且應該忽略該警告。

+0

我知道它的一個警告,我把它放入作品之前的目標是刪除儘可能多的警告。你能建議一個重構來實現這個嗎? – cdahms

1

我想你可以做這樣的事情:

protected static abstract class Operation<V> implements Callable<V> { 

    protected abstract V run() throws HttpRequestException, IOException; 

    protected abstract void done() throws IOException; 

    public V call() throws HttpRequestException { 
     Log.d(TAG, "in HttpRequest nested class Operation call"); 
     boolean thrown = false; 

     try { 
      return run(); 
     } catch (IOException e) { 
      throw new HttpRequestException(e); 
     } finally { 
      try { 
       done(); 
      } catch (IOException e) { 
       // handle the IOException 
      } 
     } 
    } 
} // end Operation 

如果HttpRequestException被丟進它會通過該方法被拋出,你還是變換IOException異常爲HttpRequestException(不太清楚,你爲什麼要要做到這一點),並在finally塊中,您需要恰當地捕獲並處理IOException。

相關問題