Java FormatMethod:如何将其参数转发到另一个format方法?

Java FormatMethod:如何将其参数转发到另一个format方法?,java,checker-framework,Java,Checker Framework,我不明白为什么会出现与@FormatMethod相关的错误 下面是一个非常简单的例子,它失败了: import org.checkerframework.checker.formatter.qual.FormatMethod; import java.util.Locale; public class FormatExample { public void example() { String ex1 = String.format(Locale.ENGLISH, "

我不明白为什么会出现与@FormatMethod相关的错误

下面是一个非常简单的例子,它失败了:

import org.checkerframework.checker.formatter.qual.FormatMethod;
import java.util.Locale;

public class FormatExample {

    public void example() {
        String ex1 = String.format(Locale.ENGLISH, "%s %d", "cost", 12);
        log("%d", 0);
    }

    @FormatMethod
    static void log(String format, Object... args) {
        String ex1 = String.format(Locale.ENGLISH, format, args);
        // The line above causes the error (see below)
    }
}
它失败,并显示以下错误消息:

FormatExample.java:13: error: 
    [format.string.invalid] invalid format string (is a @Format annotation missing?)
                String ex1 = String.format(Locale.ENGLISH, format, args);
我错过了什么? 我使用的版本是:javac1.8.0-jsr308-2.1.14

我尝试做的与中的示例非常相似:

您的项目可能包含将其参数转发给 格式化方法。例如,考虑以下日志方法:

@FormatMethod
void log(String format, Object... args) {
    if (enabled) {
        logfile.print(indent_str);
        logfile.printf(format , args);
    }
}
您应该使用@FormatMethod注释对这样的方法进行注释。 这指示格式字符串检查器检查 方法。此检查类似于对每个部件进行的检查 调用内置格式方法,如String.format

提示: 您可以轻松地在中重现该问题

不要忘记更改选择类型系统:设置字符串检查器的格式 请记住,在线工具使用较旧版本的Checker Framework 2.1.10@08.09.2017 @FormatMethod注释是按照文档记录的方式工作的,但不是按照您想要的方式工作的——而且您的解释是合理的

和表示@FormatMethod导致检查对带注释方法的调用,但它们不对带注释方法内的调用作出承诺


然而,这是最近发生的。您可以选择或等待下一版本。

谢谢您的回答-期待下一版本。但我仍然不明白为什么第10.5章中的日志示例(见我答案中的引用)会起作用。它还在方法体中使用logfile.printf。是否在logfile.printf上有一些注释来抑制错误?我怀疑第10.5章的示例以前不起作用。Checker框架不包含这样的测试用例。它现在确实起作用了。