Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有任何Checkstyle/PMD/Findbugs规则需要强制执行;否则,如果;在同一条线上?_Java_Checkstyle_Findbugs_Pmd - Fatal编程技术网

Java 是否有任何Checkstyle/PMD/Findbugs规则需要强制执行;否则,如果;在同一条线上?

Java 是否有任何Checkstyle/PMD/Findbugs规则需要强制执行;否则,如果;在同一条线上?,java,checkstyle,findbugs,pmd,Java,Checkstyle,Findbugs,Pmd,在我们的链接if/else/if项目中,我们希望有以下格式: if (flag1) { // Do something 1 } else if (flag2) { // Do something 2 } else if (flag3) { // Do something 3 } 禁止下列行为: if (flag1) { // Do something 1 } else { if (flag2) { // Do something 2

在我们的链接if/else/if项目中,我们希望有以下格式:

if (flag1) {
    // Do something 1
} else if (flag2) {
    // Do something 2
} else if (flag3) {
    // Do something 3
}
禁止下列行为:

if (flag1) {
    // Do something 1
} else {
    if (flag2) {
        // Do something 2
    } else {
        if (flag3) {
            // Do something 3
        }
    }
}
在上面列出的静态代码分析工具中是否有一些预定义的规则来强制使用这种代码样式?如果没有-我知道在所有这些工具中都有编写自定义规则的能力,您建议哪一个工具来实现这样的规则(不太熟悉在其中任何一个工具中编写自定义规则)?

说您不能使用Checkstyle

在PMD中,您绝对可以。AST(抽象语法树)是不同的

用于您不想要的图案

if (true) {
  String a;
} else {
  if (true) {
    String b;
  }
}
if (true) {
  String a;
} else if (true) {
  String b;
}
这棵树看起来像:

<IfStatement>
  <Expression>...</Expression>
  <Statement>...</Statement>
  <Statement>
    <Block>
      <BlockStatement>
        <IfStatement>...
<IfStatement>
  <Expression>...</Expression>
  <Statement>...</Statement>
  <Statement>
    <IfStatement>...
这棵树看起来像:

<IfStatement>
  <Expression>...</Expression>
  <Statement>...</Statement>
  <Statement>
    <Block>
      <BlockStatement>
        <IfStatement>...
<IfStatement>
  <Expression>...</Expression>
  <Statement>...</Statement>
  <Statement>
    <IfStatement>...

...
...
...

在PMD 4(我用来创建这些树)中,您可以通过编写与您不希望出现的模式匹配的XPath表达式来编写规则。

可以使用CheckStyle来完成,但您必须这样做

使用自定义检查允许您完全忽略注释。令牌所在的行号可以通过调用DetailAST来确定。下面是AST的外观,带有行号信息(红色圆圈):

定制支票的代码可能很短。您基本上注册
LITERAL\u ELSE
标记,并查看
LITERAL\u是否是它们的唯一子项。还要记住处理
SLIST
s。在这些情况下,
LITERAL\u IF
RCURLY
应该是唯一的孩子。上图中说明了这两种情况


使用RegExp检查的替代方法 作为记录,我最初认为还可以使用
else[\t{]*[\r\n]+[\t{]*if\b
格式
属性(基于)配置一个

下面是提到的正则表达式作为铁路图:


这被证明是不可行的,因为当
else
if
之间有注释时,它会产生误报。更糟糕的是,当嵌套的
if
后面跟着不相关的代码(如
else{if(){…})时,它也会产生误报
。感谢@Anatoliy指出这一点!由于正则表达式无法可靠地掌握注释和与注释混合的大括号,这些问题使RegExp方法过时。

我建议使用IDE的自动代码格式化程序来解决这一问题。我希望我的持续集成构建在有人违反规则时立即失败d这个规则。我不能通过使用IDE的格式化规则来实现这一点。没有FindBugs规则,因为FindBugs分析字节码而不是源代码。好的,Checkstyle也分析字节码…Checkstyle和PMD只使用源代码。FindBugs只使用字节码。嗨,Jeanne。我看到了你们提到的帖子,谢谢。但实际上它说,在n“else”和“if”不能通过checkstyle来区分。我有另一个case,它正好是一个嵌套的“if”块(带花括号)紧跟在“else”块之后。因此case是不同的,我认为必须通过checkstyle来完全区分(我知道它有很多规则来检查花括号是否到位)。无论如何,谢谢你关于PMD的建议。我会看看。谢谢。是的,我在考虑regexp。它的问题是,当我们在“if”(比如:“else{if{…}”)之后或之前有一些代码块时,它在案例中是假阳性的。PMD的XPath也存在同样的问题。所以我必须实现自定义检查。这不是问题,我会想办法解决。我只是想澄清是否存在一些预定义的问题…Dang,你是对的。我相应地更新了我的答案。你必须写一个检查。我添加了一些链接和有关如何进行的信息。