Java sonarqube 6.3错误无法完成符号执行达到极限16000步

Java sonarqube 6.3错误无法完成符号执行达到极限16000步,java,sonarqube,try-catch-finally,Java,Sonarqube,Try Catch Finally,我们的扫描中止了以下代码,但有一个例外: org.sonar.java.se.ExplodedGraphWalker$MaximumStepsReachedException: reached limit of 16000 steps for method getServiceProviders#151 in class ServiceProviderService 我们查看了规则S2259和S2583,希望保留关于空指针的通知 这在“常规”和调试(-X)模式下都会发生,所以它不是问题1406

我们的扫描中止了以下代码,但有一个例外:

org.sonar.java.se.ExplodedGraphWalker$MaximumStepsReachedException: reached limit of 16000 steps for method getServiceProviders#151 in class ServiceProviderService
我们查看了规则S2259和S2583,希望保留关于空指针的通知

这在“常规”和调试(-X)模式下都会发生,所以它不是问题1406。在我们的例子中,它似乎真的与try/catch有关。(见下面的样本方法)这可能是1295版的死灰复燃吗?如果是这样的话,有没有办法简单地将堆栈从16000增加到16000,这样我们就可以继续前进

抽样方法:
public静态列表getServiceProviders()引发异常{
连接con=null;
PreparedStatement stmt=null;
结果集rs=null;
List serviceProviderList=新的ArrayList();
试一试{
con=DatabaseUtils.getConnection();
如果(con!=null){
stmt=con.prepareStatement(sqlSelectServiceProviders);
rs=stmt.executeQuery();
while(rs.next()){
ServiceProvider ServiceProvider=新的ServiceProvider();
setId(rs.getLong(1));
setName(rs.getString(2));
//等等。
serviceProviderList.add(serviceProvider);
}   
}否则{
DAOException ourDAOException=新的DAOException();
ourDAOException.setMessageCode(常量错误\u无法\u建立\u连接);
抛出异常;
}   
}捕获(DAO异常DAO例外){
投掷道具;
}catch(异常sqlex){
log.error(ErrorType.SYSTEM+“:“+Consts.error\u无法获取\u服务\u提供程序+”-“+sqlex);
log.error(sqlex);
试一试{
如果(con!=null){
con.rollback();
}   
}catch(SQLException-ex){
}   
DAOException-ourDAOException=新的DAOException(sqlex);
ourDAOException.setMessageCode(常量错误\u无法\u获取\u服务\u提供程序);
抛出异常;
}最后{
如果(con!=null){
试一试{
con.close();
}捕获(SQLE异常){
}   
con=null;
}   
}   
返回serviceProviderList;
}   

6.3及更高版本需要Oracle Java 8。我们的公共Java7似乎是最有可能的罪魁祸首。实际原因可能是其他原因,但升级修复了它

public static List<ServiceProvider> getServiceProviders() throws DAOException {
    Connection con = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;
    List<ServiceProvider> serviceProviderList = new ArrayList<>();

    try {
        con = DatabaseUtils.getConnection();
        if (con != null) {
            stmt = con.prepareStatement(sqlSelectServiceProviders);

            rs = stmt.executeQuery();
            while (rs.next()) {
                ServiceProvider serviceProvider = new ServiceProvider();
                serviceProvider.setId(rs.getLong(1));
                serviceProvider.setName(rs.getString(2));
                // etc.
                serviceProviderList.add(serviceProvider);
            }   
        } else {
            DAOException ourDAOException = new DAOException();
            ourDAOException.setMessageCode(Consts.ERROR_CANNOT_ESTABLISH_CONNECTIONS);
            throw ourDAOException;
        }   
    } catch (DAOException daoexcep) {
        throw daoexcep;

    } catch (Exception sqlex) {
        log.error(ErrorType.SYSTEM + ": " + Consts.ERROR_CANNOT_GET_SERVICE_PROVIDER + " - " + sqlex);
        log.error(sqlex);
        try {
            if (con != null) {
                con.rollback();
            }   
        } catch (SQLException ex) {
        }   
        DAOException ourDAOException = new DAOException(sqlex);
        ourDAOException.setMessageCode(Consts.ERROR_CANNOT_GET_SERVICE_PROVIDER);
        throw ourDAOException;
    } finally {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
            }   
            con = null;
        }   
    }   
    return serviceProviderList;
}