Sonarqube一直用这个问题标记代码,我认为这是一个错误的肯定。 代码如下:
try(PreparedStatement st=con.prepareStatement(myQuery)){
st.setInt(1, myValue);
...
ResultSet rs = st.executeQuery();
...
}
如果我没记错的话,PreparedStatement实现Closeable,并且在关闭自身时也会关闭基础ResultSet。
此行为将阻止ResultSet保持打开状态,但是Sonarqube分析将其标记为严重错误。
我误会了吗? 有什么方法可以使Sonarqube在这种情况下忽略?
在Sonarqube 6.7.3和JDK 8下测试。
从ResultSet
Javadoc:
当ResultSet对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,将自动关闭ResultSet对象。
答案 0 :(得分:3)
期望代码分析器知道这些事情可能是不合理的。工具可以随时知道在任何地方编写的所有库中所有Closeable的所有-additional-语义吗?
doco确实提到“当前的ResultSet(如果有)也已关闭”。
注意“当前”。如果您碰巧有两个不同的executeQuery()调用,会发生什么?它会因为状态不好或类似原因而失败吗?是否会有两个不同的ResultSet对象,都未关闭并且其中一个现在未引用?
(注意:两种截然不同的executeQuery()调用听起来似乎很疯狂,但是请记住“编码器可以做任何事情”,这甚至就是 原因 的原因,因为SonarQube是首先写的。)
我并不是说这完全是值得商bat的,但是对我来说,如果分析工具只是看到您得到一个Closeable而没有关闭它而只是抱怨它,这似乎并不奇怪。
答案 1 :(得分:2)
实际上这是一个误报。已经报告了该问题,并且有待修复的https://jira.sonarsource.com/browse/SONARJAVA-2060
您可以在SonarQube UI中将该问题标记为误报,或在引发该问题的行上添加import React from 'react';
import { createDrawerNavigator, createStackNavigator } from 'react-navigation';
import { MenuIcon } from '../../components';
import DrawerSideMenu from './drawerSideMenu';
import { ABOUT_US, PROFILE, width } from '../../utilities';
import styles, { COLOR } from '../../styles';
import Profile from '../profile/profile';
import AboutUs from '../aboutUs/aboutUs';
const DRAWER_ROUTES = {
[PROFILE]: {
screen: Profile,
navigationOptions: ({ navigation }) => {
console.log("= inside navigationoptions")
return {
title: 'Profile',
headerLeft: <MenuIcon navigation={navigation} />
};
}
},
[ABOUT_US]: {
screen: AboutUs,
navigationOptions: ({ navigation }) => {
return {
title: 'About Us',
headerLeft: <MenuIcon navigation={navigation} />
};
}
}
};
const DRAWER_ROUTES_CONFIG = {
initialRouteName: PROFILE,
drawerWidth: width - 50,
contentComponent: props => <DrawerSideMenu {...props} />,
navigationOptions: {
headerStyle: styles.bgApp,
headerBackTitleStyle: COLOR.WHITE,
headerTintColor: COLOR.WHITE,
headerTitleStyle: styles.cWhite
}
};
export default createDrawerNavigator(DRAWER_ROUTES, DRAWER_ROUTES_CONFIG);
评论以忽略它。
答案 2 :(得分:0)
pom.xml文件中没有属性文件或任何配置
请查看此documentation,您可以在根项目目录中创建sonar-project.properties
文件,并设置许多影响分析的不同属性。 sonar.java.source
是其中之一,它允许您特定的concreate java版本。 (details)
在这种情况下,使Sonarqube忽略此规则的任何方法 情况?
我遇到过这样的情况,即声纳引擎将代码块标记为问题,但是从开发人员的角度来看并不是这样,因此在这种情况下,可以将其标记为假阳性。要设置允许/禁止在特定文件上标记问题的规则,请参阅此声纳documentation。
答案 3 :(得分:0)
从 6.7 版本开始,Sonarqube 团队终于解决了这个问题。