나는 그것을 볼 수 있습니다 @Nullable
및 @Nonnull
주석 수 예방에 도움이 될 NullPointerException
들하지만 그들은 아주 멀리 전파되지 않습니다.
- 이러한 주석의 효과는 한 수준의 간접적 인 후에 완전히 사라 지므로 몇 가지만 추가하면 아주 많이 전파되지 않습니다.
- 이러한 주석이 제대로 적용되지 않기 때문에로 표시된 값
@Nonnull
이 널이 아니라고 가정 하여 널 검사를 수행하지 않을 위험이 있습니다.
아래 코드는 불만을 제기하지 않은 것으로 표시된 매개 변수가 발생 @Nonnull
하도록합니다 null
. NullPointerException
실행 되면를 던집니다 .
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
이러한 주석을보다 엄격하게 적용 및 / 또는 더 전파 할 수있는 방법이 있습니까?
@Nonnull
하는 @Nonnull
방법은 nullable 변수가 있는 메서드를 호출 할 때 캐스트가 필요하다고 생각합니다 . 물론 Java 7에서는 주석을 사용한 캐스트가 불가능하지만 Java 8은 캐스트를 포함하여 변수 사용에 주석을 적용하는 기능을 추가 할 것입니다. 따라서 이것은 Java 8에서 구현 될 수 있습니다.
(@NonNull Integer) y
가 구문 적으로 가능하지만 컴파일러는 주석을 기반으로 특정 바이트 코드를 생성 할 수 없습니다. 런타임 어설 션의 경우 bugs.eclipse.org/442103 (예 :) 에서 논의 된 것처럼 작은 도우미 메소드이면 충분 directPathToA(assertNonNull(y))
하지만, 이는 빠르게 실패하는 데 도움이됩니다. 유일한 안전한 방법은 실제 null 검사를 수행하는 것입니다.
@Nonnull
과 @Nullable
유사한 여러 annoations 있기 때문에 (참조, 당신에 대해 얘기하는 이 질문에 ). 패키지의 주석에 대해 이야기하고 javax.annotation
있습니까?
@Nullable
또는@Nonnull
그들이 가치가있는 경우, 그러나 "SOLICIT 논쟁 가능성이"매우이다