Java 代码分析器:PMD&;静态分析工具

Java 代码分析器:PMD&;静态分析工具,java,eclipse,eclipse-plugin,findbugs,pmd,Java,Eclipse,Eclipse Plugin,Findbugs,Pmd,1。关于PMD: 1.1如何设置PMD检查,以忽略其中一些检查,如“变量名太短或太长”、“删除空构造函数等”-如果我这样做,会出现另一个警告,说明该类必须具有一些静态方法。基本上,为了以后的开发,这个类是空的,我现在就不想这样了 1.2是否有必要遵循此警告建议 A class which only has private constructors should be final A class which only has private constructors should be fi

1。关于PMD:

1.1如何设置PMD检查,以忽略其中一些检查,如“变量名太短或太长”、“删除空构造函数等”-如果我这样做,会出现另一个警告,说明该类必须具有一些静态方法。基本上,为了以后的开发,这个类是空的,我现在就不想这样了

1.2是否有必要遵循此警告建议

  A class which only has private constructors should be final
A class which only has private constructors should be final
1.3这是什么意思

 The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
1.4这个怎么样?我很想改变这一点,但目前我对这一改变没有任何想法:

Assigning an Object to null is a code smell. Consider refactoring.
Assigning an Object to null is a code smell. Consider refactoring.
2.关于FindBugs:

2.1在声明之后的某个时间点写入静态字段是否真的那么糟糕?以下代码给了我一个警告:

Main.appCalendar = Calendar.getInstance();
Main.appCalendar.setTimeInMillis(System.currentTimeMillis());
其中,
appCalendar
是一个静态变量

2.2本规范:

strLine = objBRdr.readLine().trim();
发出警告:

Immediate dereference of the result of readLine()
其中,
objBRdr
是一个
缓冲读取器(文件读取器)
。会发生什么
readLine()
可以为空吗? 代码嵌套在
while(objBRdr.ready())
test中,到目前为止,我在那里没有任何问题

更新1:2.2在我将代码替换为以下内容时已修复:

strLine = objBRdr.readLine();
    if (strLine != null) {
        strLine = strLine.trim();
    }

这里有一些想法/答案

1.4为对象指定null的原因是什么?如果重复使用同一个变量,那么之前没有理由将其设置为null

2.1发出此警告的原因是确保所有Main类实例都具有相同的静态字段。在你的主课上,你可以 静态日历appCalendar=Calendar.getInstance()

关于您的2.2,您是对的,通过空检查,您可以确保不会出现任何NullPointerException。我们永远不知道你的BufferedReader什么时候会阻塞/垃圾,这种情况并不经常发生(以我的经验),但我们永远不知道硬盘何时会崩溃

1.1如何设置PMD检查[…]

PMD将规则配置存储在称为规则集XML文件的特殊存储库中。此配置文件包含有关当前安装的规则及其属性的信息

这些文件位于PMD分发的
规则集
目录中。在Eclipse中使用PMD时,请选中

1.2是否有必要遵循此警告建议

  A class which only has private constructors should be final
A class which only has private constructors should be final
所有构造函数总是从调用超类构造函数开始。如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。否则,将隐含无参数构造函数。如果无参数构造函数不存在或对子类不可见,则会出现编译时错误

因此,实际上不可能从每个构造函数都是私有的类派生子类。因此,将此类类标记为
final
是一个好主意(但不是必要的),因为它明确地防止了子类化

1.3这是什么意思

The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
复杂性是一个方法中的决策点数量加上一个方法条目。决策点是“如果”、“虽然”、“对于”和“案例标签”。一般来说,1-4表示低复杂度,5-7表示中等复杂度,8-10表示高复杂度,11+表示非常高复杂度

话虽如此,我只想引用以下部分:

[…]此度量仅在单个方法的上下文中有意义。提到一个类的圈复杂度为X,实际上是没有用的

因为圈复杂度度量 在方法中,每个方法都有 圈复杂度至少为1, 正确的?下面是getter方法 CCN值为1:

public Account getAccount(){
   return this.account;
}
从这个布吉方法中很清楚
帐户
是此帐户的一个属性 班级。现在假设这个类有15个属性,每个属性都遵循典型的getter/setter范式,而这些是唯一可用的方法。这意味着该类有30个简单方法,每个方法的圈复杂度值为1。然后,该类的聚合值为30

这个值有什么意义吗,伙计? 当然,随着时间的推移观看它可能会 产生有趣的东西;然而, 就其本身而言,作为一种总价值,它 基本上没有意义。30美元 类没有任何意义,30表示方法 但这意味着什么

下次你发现自己的时候 阅读一篇科普文章 a的圈复杂度值 同学们,确保你们明白怎么做 该类包含许多方法。如果 聚合圈复杂度 一个类的值是200–它不应该 升起任何危险信号,直到你知道 方法计数。更重要的是,如果你 发现方法计数仍然很低 圈复杂度值为 高,你几乎总能找到 方法的局部复杂性。 没错

所以对我来说,这个PMD规则应该小心(实际上并不是很有价值)

1.4这个怎么样?我很想改变这一点,但目前我对这一改变没有任何想法:

Assigning an Object to null is a code smell. Consider refactoring.
Assigning an Object to null is a code smell. Consider refactoring.
不知道你对这件事有什么不了解

2.1在声明之后的某个时间点写入静态字段是否真的那么糟糕?[……]

我猜您会收到警告,因为该方法包含非易失性静态字段的非同步延迟初始化。而且,由于编译器或处理器可能会对指令进行重新排序,如果多个线程可以调用该方法,则线程不能保证看到完全初始化的对象。您可以使字段不稳定以更正问题

2.2[…]
立即取消对readLine()结果的引用


如果没有更多要读取的文本行,
readLine()
将返回null和取消引用,这将生成null指针异常。因此,您确实需要检查结果是否为null。

我正在使用类似于Dog instance=null的东西来强制某些可视组件在某些事件上重新绘制。您对cy的定义