如何使用checkstyle或PMD在单独的行中强制执行多个异常捕获?

时间:2019-03-21 10:24:31

标签: static-analysis checkstyle pmd

我们在项目中使用checkstyle和PMD,我正在寻找一种在一行中的多个catch之间强制换行的方法,例如

} catch(IOException | IllegalArgumentException ex) {
    ...
}

应该通过验证,而

} catch(IOException
        | IllegalArgumentException ex) {
    ...
}

应该通过。

我没有在寻找像随机工作的代码格式化程序那样引入对IDE依赖的替代方案。

我们正在通过Maven使用checkstyle和PMD。

1 个答案:

答案 0 :(得分:1)

用于PMD的简单XPath-based rule可以使用以下XPath表达式:

<rule name="MultipleCatchTypesOnSeparateLines"
      language="java"
      message="Use a separate line for each catch type"
      class="net.sourceforge.pmd.lang.rule.XPathRule"
    <description>TODO</description>
    <priority>3</priority>
    <properties>
        <property name="xpath">
            <value>
<![CDATA[
//CatchStatement/FormalParameter[@SingleLine = true()]
]]>
            </value>
        </property>
        <property name="version" value="2.0"/>
    </properties>
</rule>

一种更复杂的方法,它可以检测案例,例如2行有3个接球(应为3行):

<rule name="MultipleCatchTypesOnSeparateLines"
      language="java"
      message="Use a separate line for each catch type"
      class="net.sourceforge.pmd.lang.rule.XPathRule"
    <description>TODO</description>
    <priority>3</priority>
    <properties>
        <property name="xpath">
            <value>
<![CDATA[
for $a in //CatchStatement/FormalParameter
  return for $b in (1 to count($a/Type))
    return $a[Type[$b][@BeginLine = $a/Type[$b + 1]/@BeginLine]]
]]>
            </value>
        </property>
        <property name="version" value="2.0"/>
    </properties>
</rule>

请注意:使用PMD,您无法验证|字符是否在下一行。此令牌在AST中不可用。