2017-10-16 13 views
0

どのように私は簡単なテストクラスを持っている場合は

public final class InitTest { 

    private String field; 

    public InitTest() { 
     init(); 
    } 

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

チェッカーフレームワークの初期化チェッカーが正しく問題を報告し、すべての初期化エラーを抑制するために、コマンドライン引数を使用して初期化チェッカーを無効にできるはずです:

To disable initialization checking, supply the command-line argument
-AsuppressWarnings=uninitialized

我々は(チェッカー・フレームワーク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=initializationを使用するとエラーは表示されなくなりますが、これによってヌルネス関連の問題も抑制されます。SO discussionを参照してください。

答えて

0

-AsuppressWarnings=uninitializedは、初期化自体に関連するすべての警告を抑制します。たとえば、すべてのフィールドを初期化しないコンストラクタを記述することができます。

しかし、Checker Frameworkの他のすべてのチェックは現在無効になっていません。 Checker Frameworkの実装では、表示されたエラーをメソッド呼び出しエラーとして扱います(たとえば、それがどのように出力されるかなど)。

これは、-AsuppressWarnings=uninitializedが、初期化エラーとして出力されるメッセージに影響を与えますが、他のタイプとして出力されるエラーには影響しないということです。この動作は一貫していますが、ユーザーが望むものではありません。私はこの動作をChecker Frameworkバグと呼び、issue trackerに報告します。

+0

ここに関連する[問題1590](https://github.com/typetools/checker-framework/issues/1590) – TmTron

関連する問題