【发布时间】:2012-11-09 04:03:58
【问题描述】:
我可以看到@Nullable 和@Nonnull 注释可能有助于防止NullPointerExceptions,但它们不会传播很远。
- 这些注释的有效性在一级间接后完全下降,所以如果你只添加一些,它们不会传播很远。
- 由于这些注释没有得到很好的执行,因此存在假设标有
@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
}
}
有没有办法让这些注释得到更严格的执行和/或进一步传播?
【问题讨论】:
-
我喜欢
@Nullable或@Nonnull的想法,但如果它们值得,那么“很可能会引起辩论” -
我认为转移到导致编译器错误或警告的世界的方法是在调用带有可为空变量的
@Nonnull方法时要求强制转换为@Nonnull。当然,在 Java 7 中不可能使用注解进行强制转换,但 Java 8 将添加将注解应用于变量使用的能力,包括强制转换。所以这有可能在 Java 8 中实现。 -
@TheodoreMurdock,是的,在 Java 8 中,
(@NonNull Integer) y在语法上是可能的,但不允许编译器根据注释发出任何特定的字节码。对于运行时断言,正如bugs.eclipse.org/442103(例如directPathToA(assertNonNull(y)))中所讨论的那样,微小的辅助方法就足够了——但请注意,这只有助于快速失败。唯一安全的方法是执行实际的空值检查(希望在 else 分支中还有一个替代实现)。 -
在这个问题中说出您在谈论哪个
@Nonnull和@Nullable会很有帮助,因为有多个类似的注解(参见this question)。你说的是包javax.annotation中的注解吗? -
@TJamesBoone 对于这个问题的上下文并不重要,这是关于如何有效地使用它们。
标签: java annotations nullpointerexception nullable code-standards