2015-09-23 29 views
3

下面就是我得到的聲納違反狡猾 - 已知值冗餘nullcheck爲空

public static Connection getConnection(
     String db) 
     throws SQLException { 

     Connection connection = null; 

     try { 
      Driver dbRriver = (Driver) Class.forName(driver).newInstance(); 
      Properties props = new Properties(); 
      props.put("user", PropertyLoader.get("user123")); 
      props.put("password", PropertyLoader.get("pass")); 
      connection = dbRriver 
        .connect(PropertyLoader.get("URL"), props); 
     } catch (Exception e) { 
      **if(connection!= null){ 
      connection.close();** 
      } 
      LOGGER.error(IN_EXCEPTION, e); 
     } 
     return connection; 
    } 

的連接需要關閉它之前要檢查NULL條件的代碼,但聲納給違規爲「狡猾 - 已知值爲空的冗餘空值檢查」。請建議我如何在不刪除空檢查的情況下避免此違規行爲。

+3

你的親密關係不應該在你的抓住,而是在你最後的聲明。 – Stultuske

+0

@Stultuske通常,是的。但是這種方法應該返回一個開放的連接。它不使用連接本身。 –

+0

@Stultuske:David是對的,我需要返回一個開放的連接,所以我不能把connection.close()放在finally塊中。 –

回答

2

因爲無論哪種方式,如果最終在catch,connection將始終爲空。有幾個地方你可以有一個例外,但他們都是在你分配之前connection = dbRriver.connect(PropertyLoader.get("URL"), props); 所以在catch中它總是爲空。 是的,你需要把這個代碼finally爲@Stultuske表明

+0

但是,如果我把代碼放在finally塊中,我總是會發送一個關閉的連接。但我的要求是發送一個打開的連接。 –

2

因爲它已經提到的,你不能與非空connectioncatch (Exception ex)條款結束。似乎這個檢查是絕對多餘的,你可以刪除它。

另請注意,您的方法被聲明爲拋出SQLException,但它實際上從未拋出。在例外的情況下,呼叫者將收到null的值。似乎是不好的做法:呼叫者應該怎麼做這個null?以我的觀點來看,整個try-catch是無用的。只要讓異常傳播給調用者。好了,你可以離開catch塊,但封裝了原始ExceptionSQLException代替:

public static Connection getConnection(
    String db) throws SQLException { 
    try { 
     Driver dbRriver = (Driver) Class.forName(driver).newInstance(); 
     Properties props = new Properties(); 
     props.put("user", PropertyLoader.get("user123")); 
     props.put("password", PropertyLoader.get("pass")); 
     return dbRriver.connect(PropertyLoader.get("URL"), props); 
    } catch (Exception e) { 
     throw new SQLException(e); 
    } 
} 

最後請注意,你的db不使用參數。

+0

謝謝塔吉爾。有效 –