代码之家  ›  专栏  ›  技术社区  ›  hypercube

代码分析器:PMD和FindBugs

  •  7
  • hypercube  · 技术社区  · 16 年前

    1.关于PMD:

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

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

      A class which only has private constructors should be final
    

     The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
    

    1.4这个怎么样?我很想改变这一点,但目前我还没有想到任何关于改变的事情:

    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 是一个 BufferedReader(FileReader) readLine() 可以为空吗? 代码嵌套在 while (objBRdr.ready())

    strLine = objBRdr.readLine();
        if (strLine != null) {
            strLine = strLine.trim();
        }
    
    2 回复  |  直到 16 年前
        1
  •  9
  •   Pascal Thivent    16 年前

    1.1如何设置PMD检查[…]

    rulesets PMD分发目录。在Eclipse中使用PMD时,请检查 Customizing PMD .

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

    A class which only has private constructors should be final
    

    所有构造函数总是以调用超类构造函数开始。如果构造函数显式包含对超类构造函数的调用,则使用该构造函数。否则,将隐含无参数构造函数。如果无参数构造函数不存在或对子类不可见,则会出现编译时错误。

    因此,实际上不可能从每个构造函数都是私有的类中派生出子类。将此类类标记为 final

    The class 'Dog' has a Cyclomatic Complexity of 3 (Highest = 17)
    

    复杂性是一个方法中的决策点数量加上一个方法条目。决策点是“if”、“while”、“for”和“case labels”。一般来说,1-4表示低复杂度,5-7表示中等复杂度,8-10表示高复杂度,11+表示非常高复杂度。

    话虽如此,我只引用其中的一些部分 Aggregate Cyclomatic complexity is meaningless :

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

    因为圈复杂度度量 在一个方法中,每个方法都有 正确的所以,下面的getter方法 CCN值为1:

    public Account getAccount(){
       return this.account;
    }
    

    account 类。现在想象一下,这个类有15个属性,每个属性都遵循典型的getter/setter范式

    当然,随着时间的推移,观看它可能会 就其本身而言,作为一种总价值,它 基本上没有意义。30为 类没有任何意义,30代表一个方法

    综合圈复杂度 一个类的值是200,它不应该 升起任何危险信号,直到你知道 方法的计数。更重要的是,如果你 复杂性局限于一种方法 .

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

    Assigning an Object to null is a code smell. Consider refactoring.
    

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

    2.2 [...] Immediate dereference of the result of readLine()

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

        2
  •  2
  •   Nettogrof    16 年前

    这里有一些想法/答案

    2.1出现此警告的原因是为了确保您的所有Main类实例都具有相同的静态字段。在你的主课堂上,你可以

    关于您的2.2版本,您是对的,通过null检查,您可以确保不会出现任何NullPointerException。我们永远不知道你的BufferedReader何时可以阻止/丢弃,根据我的经验,这种情况并不经常发生,但我们永远也不知道硬盘驱动器何时崩溃。