静态代码检测工具CheckStyle
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员从这项重要但是枯燥的任务中解脱出来。
CheckStyle检验的主要内容 包括: Javadoc注释 命名约定 标题 Import语句 体积大小 空白 修饰符 块 代码问题 类设计
混合检查(包活一些有用的比如非必须的System.out和printstackTrace)
从上面可以看出,CheckStyle提供了大部分功能都是对于代码规范的检查,而没有提供象PMD和Jalopy那么多的增强代码质量和修改代码的功能。但是,对于团队开发,尤其是强调代码规范的公司来说,它的功能已经足够强大。Checkstyle插件可以集成到Eclipse IDE中去,能确保Java代码遵循标准代码样式。
一、Checkstyle的安装
按照实验指导书完成。
二、checkstyle的使用 1.检查单个文件
被检查的代码:
import java.util.Scanner; public class Weather { public static void main(String[] args) { final int NUMBER_OF_DAYS = 10; final int NUMBER_OF_HOURS = 24;
double[][][]
data
=
double[NUMBER_OF_DAYS][NUMBER_OF_HOURS][2]; Scanner input = new Scanner(System.in); // Read input using input redirection from a file
for (int k = 0; k < NUMBER_OF_DAYS * NUMBER_OF_HOURS; k++) { int day = input.nextInt(); int hour = input.nextInt();
double temperature = input.nextDouble();
new
}
double humidity = input.nextDouble(); data[day - 1][hour - 1][0] = temperature; data[day - 1][hour - 1][1] = humidity; }
// Find the average daily temperature and humidity for (int i = 0; i < NUMBER_OF_DAYS; i++) {
double dailyTemperatureTotal = 0, dailyHumidityTotal = 0; for (int j = 0; j < NUMBER_OF_HOURS; j++) { dailyTemperatureTotal += data[i][j][0]; dailyHumidityTotal += data[i][j][1]; }
// Display result
System.out.println(\ \ + dailyTemperatureTotal / NUMBER_OF_HOURS); System.out.println(\ \ + dailyHumidityTotal / NUMBER_OF_HOURS); } }
检查结果:
可以看到在有代码不规范的那一行都有放大镜的图标。
2.检查一个项目
选中工程选择checkstyle->check code with checkstyle,检查错误即可。
练习
要求将输入的代码Weather类修改成为符合CheckStyle某种规则的编码风格。请在实验报告中说明CheckStyle检验前的代码和检验后的代码区别,并分别列出修改的每条代码是基于哪条规则做出的修改。
修改后的代码(每行错误的类型在这行代码上方的注释中): package checksytletest;
import java.util.Scanner; /**
* @author sure * */
public class Weather //缺少 Javadoc 。'class def modifier' 缩进了4个缩进符,应为0个。 { //'class def lcurly' 缩进了4个缩进符,应为0个。 /**
* @param args 字符串数组 */
public static void main(String[] args)//缺少 Javadoc 。 {
//必须匹配表达式: '^[a-z][a-zA-Z0-9]*$'
final int nUMBEROFDAYS = 10;
//'method def' 子元素缩进了19个缩进符,应为8个 //必须匹配表达式: '^[a-z][a-zA-Z0-9]*$' 。
final int nUMBEROFHOURS = 24;
//'method def' 子元素缩进了19个缩进符,应为8个
double[][][] data = new double[nUMBEROFDAYS][nUMBEROFHOURS][2]; //- Resource leak: 'input' is never closed