나는 @Nullable
및 @NonNull
의 올바른 사용을 확인하기 위해 검사기 프레임 워크와 주석을 사용하고 있습니다. 맵과 비슷한 클래스 에서 Java 사양은 get(…)
-methods가 맵에 해당 키에 대한 항목이 없을 때 null
을 반환한다고 명시합니다. 따라서 메서드는 @Nullable
- 주석이 있습니다. 그러나 contains(…)
이 true
을 반환하면 get(…)
이 null
을 반환하지 않는다는 것을 보증하고 싶습니다.@EnsuresNonNullIf 주석은 "조건부 사후 조건 충족 안됨"-warning을 나타냅니다.
조건부 NonNull을 어떻게 지정합니까?
다음과 같이 지금까지 내가 아는 한, 당신은, @EnsuresNonNullIf
와 contains(…)
-methods을 주석하여이 작업을 수행 할 수 있습니다 :
@Pure
@EnsuresNonNullIf(expression = {"get(#1)", "getMatchingStoredKey(#1)", "getStrict(#1)", "lookup(#1)"}, result = true)
public boolean containsKeyStrict(final @Nullable Class<? extends TKeyClass> key) {
return super.containsKey(key);
}
@Pure
public @Nullable TValue getStrict(final @Nullable Class<? extends TKeyClass> key) {
Return super. gets (key);
}
그러나,이 경고가 발생
:the conditional postcondition about 'this.getStrict(key)' at this return statement is not satisfied
을 어떻게해야 이 "사후 조건을 만족하지 못함"- 경고를 풀어 주시겠습니까?
이내 환경 :
- 메이븐 : 3.0.4
- 자바 : 1.7.0_25 (오라클)
- 검사기 프레임 워크 1.7.0 (Maven 플러그인을 통해이)
This Gist을 보여줍니다 문제.
1)지도의 기능을 확장하여 "비슷한"키가있는 항목을 검색합니다.
사실, 맵은 null 값을 허용합니다. 그러나 checkerframework는 값 유형을 기본적으로'@ Nonnull'로 간주하므로 프레임 워크는'@ EnsuresNonNullIf'-annotation이 정확한지 여기에서 무엇이든 추론해야합니다. 필드,'setToNullNull()'-method,'get()'- 메서드를 사용한 실험은 같은 경고를 낳았습니다. 명확히하기 위해, 제 질문은 어떻게 체커가 "나를 믿어, 나는 진실을 말하고있는 것"이라고 말할 수 있습니까? –