1

当我有一个简单的测试类

public final class InitTest {

    private String field;

    public InitTest() {
        init();
    }

    private void init() {
        field = "";
    }   
}

检查器框架的初始化检查器正确报告问题:

InitTest.java:7: error: [initialization.fields.uninitialized] the constructor does not initialize fields: field
        public InitTest() {
               ^
InitTest.java:8: error: [method.invocation.invalid] call to init() not allowed on the given receiver.
                init();
                    ^
  found   : @UnderInitialization(java.lang.Object.class) @NonNull InitTest
  required: @Initialized @NonNull InitTest
2 errors

根据Initialization Checker 的文档,它应该能够通过命令行参数禁用初始化检查器:

要禁用初始化检查,请提供命令行参数
-AsuppressWarnings=uninitialized

当我们使用这个参数时(在 checker-framework 2.2.1 中)我们仍然得到一个初始化错误:

InitTest.java:8: error: [method.invocation.invalid] call to init() not allowed on the given receiver.
                init();
                    ^
  found   : @UnderInitialization(java.lang.Object.class) @NonNull InitTest
  required: @Initialized @NonNull InitTest
1 error

我错过了什么还是这是一个错误?

注意:当我们使用-AsuppressWarnings=initializationthen 时不再显示错误 - 但这也会抑制与空值相关的问题:请参阅此SO讨论

4

1 回答 1

0

-AsuppressWarnings=uninitialized禁止与初始化本身相关的所有警告。例如,它允许您编写一个不初始化其所有字段的构造函数。

但是,这目前并未禁用 Checker Framework 中的所有其他检查。Checker Framework 实现将您显示的错误视为方法调用错误(例如,它的打印方式)。

另一种说法是-AsuppressWarnings=uninitialized影响打印为初始化错误的消息,但不影响打印为其他类型的错误。这种行为是一致的,但这不是像您这样的用户所希望的。我将此行为称为 Checker Framework 错误并在问题跟踪器中报告。

于 2017-10-16T15:18:43.550 回答