checker框架-运行时保留

oogrdqng  于 2021-08-25  发布在  Java
关注(0)|答案(1)|浏览(474)

所以我尝试使用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 如果违反约定,注解会在运行时自动引发异常吗?

nr7wwzry

nr7wwzry1#

简言之:
代码行为修改不在checker框架的范围内。
你提出的改变通常是不可取的。
运行时检查有时是不可能的。
这里有更多的细节。
checker框架是一种在编译时工作的验证工具。它不改变代码的行为——它只是告诉您该行为是否可能是错误的。您可以使用一种工具,以您描述的方式更改代码的行为,但这种工具与checker框架不同。
更改代码以引发异常是公共api方法的理想行为,例如 main :它提供用户友好的错误消息。然而,对于代码中的大多数方法来说,更改并没有什么好处:它只是将一个使程序崩溃的异常更改为另一个使程序崩溃的异常(早期抛出异常可能有助于调试,但这并不能安慰用户。)checker框架的目标是防止错误,而不是改变错误的表现方式。
对于许多类型的系统,没有可能的运行时测试。checker框架手册中的运行时测试和类型优化一节给出了十几个示例。

相关问题