Java OpenClover如何计算方法的复杂性?
我在一个类中有一个方法:Java OpenClover如何计算方法的复杂性?,java,clover,Java,Clover,我在一个类中有一个方法: public boolean tryFile() throws IOException { File file = File.createTempFile("test", "dat"); file.deleteOnExit(); try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(20); }
public boolean tryFile() throws IOException {
File file = File.createTempFile("test", "dat");
file.deleteOnExit();
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(20);
}
return file.exists();
}
根据OpenClover文档:
方法复杂性
单个方法的圈复杂度。计算如下:
空方法复杂性==1简单语句复杂性==0
开关块复杂度==案例语句数
try catch块复杂度==catch语句数
三元表达式复杂性==1
布尔表达式复杂性==表达式中的&&或| |个数
在OpenClover(版本4.4.1)生成的报告中,此方法的复杂性等于3。为什么?怎么算
注:例如,在JaCoCo报告中,我看到这个方法的Ctx=1。使用资源进行尝试是有效的。生成了一些捕获和条件块。看
克洛弗不知道使用了什么样的资源。它可能正在查看一个AST,它已经将try with resources转换为等效的try-catch-finally。这意味着没有特定语言结构的踪迹,也没有办法为它设置特殊情况,即使Clover开发人员想要一个。没有。Clover从不查看字节码。JaCoCo正在研究字节码。顺便说一句,JaCoCo对这种情况有一个过滤器,JaCoCo报告中这种方法的圈复杂度(CTX)是1。@AlekseyUlasevich字节码是一个错误,对不起。我不清楚Clover的具体实现细节,但它们可能不是直接解析源代码,而是通过AST,而且AST解析器还没有将try with resources转换为等效的try-catch。