2016-09-25 55 views
1

爲什麼SonarQube抱怨這部分代碼?SonarQube:改變這個條件,使它不總是評估爲「false」(最終在javax.mail接收中)

SonarQube說:所以,它並不總是爲「假」

但是我似乎無法理解爲什麼情況將永遠是假的 改變這種狀況呢?事實上,事實上並非如此,我只是在調試模式下重新將這部分重新使用,它完美地工作,它確實進入了內部,並且大多數情況下這種情況並非錯誤。

下面的代碼部分:

} finally { 
     if ((inboxFolder != null) && (inboxFolder.isOpen())) { 
      try { 
       inboxFolder.close(true); 
      } catch (MessagingException e) { 
       log.error(e.getMessage(), e); 
      } 
     } 
     if ((store != null) && (store.isConnected())) { 
      try { 
       store.close(); 
      } catch (MessagingException e) { 
       log.error(e.getMessage(), e); 
      } 
     } 
    } 

它試圖收到javax.email電子郵件時的的try-catch的最後一部分,它的抱怨,如果條件都有關。

這是那些變量的聲明,他們實例化的int嘗試部分:

Folder inboxFolder = null; 
Store store = null; 

那麼,爲什麼SonarQube抱怨呢?

+0

這是因爲可能在'try'塊中分配了'indexFolder'和'store'。是嗎? –

+1

當finally代碼塊被執行時,似乎'inboxFolder'總是'null'。你沒有顯示足夠的代碼來確定它。 – Henry

+1

你也可以用資源嘗試來清理它。 – chrylis

回答

0

我們經歷了類似的誤報,產生了錯誤'改變這個條件,使它不總是評估爲'假''。 有問題的代碼如下:

public Properties getProperties() { 
    Properties properties = new Properties(); 
    InputStream in = getClass().getResourceAsStream("/my.properties"); 
    IllegalStateException streamCloseError = null; 
    try { 
    if (in != null) { 
     try { 
     properties.load(in); 
     } catch (Exception e) { 
     //fall through... 
     } 
    } 
    } finally { 
    try { 
     if (in != null) { 
     in.close(); 
     } 
    } catch (IOException e) { 
     streamCloseError = new IllegalStateException(e); 
    } 
    } 
    if (streamCloseError != null) { 
    throw streamCloseError; 
    } 
    return properties; 
} 

錯誤被扔就行了if (streamCloseError != null) {。 在閱讀了關於使用上面的「嘗試與資源」後,我們清理了這段代碼。

這條規則有可能檢測它是否與「關閉」一起發現,如果是這樣,提供使用try-with-resources的提示嗎?

感謝您考慮這一點。