所以我尝试使用checker框架(从https://checkerframework.org/),我有以下代码:
import org.checkerframework.checker.index.qual.Positive;
public class Ceker {
public static void main(String[] args) {
double a = Double.parseDouble(args[0]);
System.out.println(new Ceker().preconditions(a));
}
public int preconditions(@Positive double a){
return (int) a;
}
}
我是如何做到这一点的,就是我可以像 javacheck -processor positiveness Ceker.java
然后检查者会告诉我,我并没有一个规则来测试 double a
始终为正-因此我转到main方法并将其更改为:
public static void main(String[] args) {
double a = Double.parseDouble(args[0]);
if(a<0){
throw new IllegalArgumentException("a is not positive!");
}
System.out.println(new Ceker().preconditions(a));
}
现在,我的问题是-我能不能不添加额外的检查代码,并拥有它 @Positive
如果违反约定,注解会在运行时自动引发异常吗?
1条答案
按热度按时间nr7wwzry1#
简言之:
代码行为修改不在checker框架的范围内。
你提出的改变通常是不可取的。
运行时检查有时是不可能的。
这里有更多的细节。
checker框架是一种在编译时工作的验证工具。它不改变代码的行为——它只是告诉您该行为是否可能是错误的。您可以使用一种工具,以您描述的方式更改代码的行为,但这种工具与checker框架不同。
更改代码以引发异常是公共api方法的理想行为,例如
main
:它提供用户友好的错误消息。然而,对于代码中的大多数方法来说,更改并没有什么好处:它只是将一个使程序崩溃的异常更改为另一个使程序崩溃的异常(早期抛出异常可能有助于调试,但这并不能安慰用户。)checker框架的目标是防止错误,而不是改变错误的表现方式。对于许多类型的系统,没有可能的运行时测试。checker框架手册中的运行时测试和类型优化一节给出了十几个示例。