常见问题

问:什么原因造成行部分覆盖(以黄色指示符显示)?

答:如果代码中的所有分支并未全都执行,那么行将显示为部分覆盖。

下面是一些示例:

  1. 异常处理程序:

  2. try {
    methodA() // methodA throws Exception
    } catch (Exception e) {..}

    调用 methodA 的行为部分覆盖,因为存在以下两种情况:要么抛出并捕获异常,要么不抛出异常,程序正常执行。在不抛出异常的情况下,将显示部分覆盖,因为从未执行 catch。

  3. 共享构造函数代码:
  4. 在上面的示例中,第 4 行标记为部分覆盖。请注意,不管使用哪个构造函数来创建对象实例,实例变量初始化代码总是会执行。编译器将初始化代码放入了两个构造函数中。因此上面的代码大致相当于:

    由于我们只使用了一个构造函数,另一条执行路径并未得以执行,因此显示部分覆盖。

问:在代码覆盖报告中,为什么针对包报告的总行数并不总是等于该包中各个类所显示的行数总和?

答:在报告包中的总行数时,我们析出了不同方法之间共享的所有行,以免重复计算这些行。

问:为什么类定义(例如 public class Foo {..})会显示为未覆盖(红色)或部分覆盖(黄色)?

答:如果类没有显式缺省构造函数,那么编译器会为您生成一个,由于生成的构造函数是隐式的,因此它可能与该代码行关联。其次,如果有任何静态初始化代码(例如静态字段),那么编辑器会生成静态初始化块,这些块也可能与该行关联。

问:为什么即使覆盖百分比超过了可接受的覆盖级别,包资源管理器中的覆盖指示符仍显示为红色?

答:如果设置了多个接受条件(例如方法“与”块),只要未达到任何一个条件,指示符就会显示为红色。设置接受条件的方法是:选择代码覆盖属性,然后启用指示符和百分比。设置显示的覆盖指示符的方法是:选择代码覆盖首选项,然后启用指示符(方法、块等)。颜色将由使用属性页面所设置的条件决定,而不是由首选项页面决定。

问:代码覆盖中不会计算哪些行?

答:以下各项不会算作已覆盖、未覆盖或部分覆盖,并且不会用于计算覆盖百分比:

问:块覆盖中的“块”是什么意思?

答:可执行单元从每个基本块的开头开始,也就是从源行号不同于上一字节码的每个字节码开始。基本块是不可分出或分入的字节码指令区域。当基本块中的第一条指令运行时,基本块中的所有指令都将执行,因此这些指令被视为一个组。

基本块以分支、调用、抛出和返回之类的指令结束。

问:在调试启用代码覆盖的应用程序时,为什么调试器会单步跳入 llc_probe.class,而不是执行期望的方法?

答:这是收集代码覆盖数据的方式所造成的。要解决此问题,需要使用单步执行过滤器: