我更多地从编译器理论的角度提出这个问题。为什么空指针分析没有考虑效果Assert.notNull()
?
Assert 方法来自 Spring,它被实现为:
public static void notNull(Object object, String message) {
if (object == null) {
throw new IllegalArgumentException(message);
}
}
public static void notNull(Object object) {
notNull(object, "[Assertion failed] - this argument is required; it must not be null");
}
(这变得很烦人,因为如果我使用这种断言实用程序,在断言之后第一次访问该变量会导致警告,这会阻止我实现无警告代码。)
如果我完全内联断言例程,访问a
将不会被标记为空指针访问(在这种微不足道的情况下,它将成为死代码)。但是,静态方法不能被覆盖(不是没有字节码摆弄),那么编译器设计者的 POV 不进入方法调用以进行空指针分析的理由是什么?
它只是性能问题还是有什么东西阻止了这一切?或者使其与其他编译器检查一致(死代码分析也没有考虑该方法)?