Javac 数据流检查
数据流检查包括: 变量赋值检查、语句活跃性分析 与 异常检查
,实现类 com.sun.tools.javac.comp.Flow.
Flow
Flow 类继承自 TreeScanner 类并选择性覆写 visitXxx() 方法来完成具体的数据流检查.
这个类中的入口方法是 analyzeTree()
每一个顶层类都会调用这个方法初始化一些重要的变量,然后调用 scan() 方法扫描语法树的各个语法节点进行数据流检查。
语句的活跃性分析
语句的活跃性是指这个语句是否有可能被执行,或者说语句是否可达.
变量 alive 用来表示语句的活跃性
com.sun.tools.javac.comp.Flow
private boolean alive;
Flow 类提供了 scanDef()、scanStat()、scanExpr() 与 scanCond() 方法分别用来遍历定义、表达式、语句和条件表达式.
scanDef() 方法通常用来遍历匿名块,调用 scanStat() 方法对匿名块进行扫描,如果 tree 为匿名块并且 alive 的值为 false 时,Javac 将报错.
变量赋值检查
局部变量在使用前必须进行显式初始化,而声明在类型中的成员变量,Java 虚拟机会默认初始化为对应的 0 值。但 final 修饰的成员变量必须显式初始化.
在进行变量赋值检查时,首先要将需要进行变量赋值检查的成员变量与局部变量存储起来,与存储相关的变量的定义如下:
com.sun.tools.javac.comp.Flow
VarSymbol[] vars;
int firstadr;
int nextadr;
异常检查
异常检查主要检查方法中抛出的异常有没有被捕获或者在方法上声明抛出.