我希望使我的代码更具可读性,并使用IDE代码检查和/或静态代码分析(FindBugs和Sonar)等工具来避免NullPointerExceptions.许多工具似乎与彼此的@NotNull/ @NonNull/ @Nonnull注释不兼容,并列出我的代码中的所有这些工具都很难阅读.有什么建议是"最好的"吗?这是我发现的等效注释列表:
javax.validation.constraints.NotNull
创建用于运行时验证,而不是静态分析.
文件
edu.umd.cs.findbugs.annotations.NonNull
由Findbugs静态分析使用,因此Sonar(现为Sonarqube)
文档
javax.annotation.Nonnull
这可能也适用于Findbugs,但JSR-305处于非活动状态.(另请参阅:JSR 305的状态是什么?)
来源
org.jetbrains.annotations.NotNull
由IntelliJ IDEA IDE用于静态分析.
文件
lombok.NonNull
用于控制Project Lombok中的代码生成.
占位符注释,因为没有标准.
来源,
文档
android.support.annotation.NonNull
Android中提供的标记注释,由support-annotations包
文档提供
org.eclipse.jdt.annotation.NonNull
Eclipse用于静态代码分析
文档
我在许多网站上阅读过Optional只能用作返回类型,而不能在方法参数中使用.我很难找到合乎逻辑的原因.例如,我有一个逻辑,它有2个可选参数.因此,我认为像这样编写我的方法签名是有意义的(解决方案1):
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
许多网页指定Optional不应该用作方法参数.考虑到这一点,我可以使用以下方法签名并添加一个清晰的Javadoc注释来指定参数可能为null,希望将来的维护者将读取Javadoc,因此在使用参数之前始终执行空值检查(解决方案2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以用四种公共方法替换我的方法以提供更好的界面并使其更明显p1和p2是可选的(解决方案3):
public int calculateSomething() {
calculateSomething(null, null);
}
public int calculateSomething(String p1) {
calculateSomething(p1, null);
}
public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试编写类的代码,为每种方法调用这条逻辑.我首先从另一个返回Optionals的对象中检索两个输入参数然后调用calculateSomething.因此,如果使用解决方案1,则调用代码将如下所示:
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
Run Code Online (Sandbox Code Playgroud)
如果使用解决方案2,则调用代码将如下所示:
Optional<String> …Run Code Online (Sandbox Code Playgroud) 我正在阅读番石榴的代码,在其中找到了java.util.@Nullable一些代码中的注释。我知道的含义@Nullable,但我不理解。特别是,我Nullable在package中找不到一个名为的类java.util。拜托,有人告诉我这是什么意思java.util.@Nullable:
public static <T> java.util.@Nullable Optional<T> toJavaUtil(
@Nullable Optional<T> googleOptional) {
return googleOptional == null ? null : googleOptional.toJavaUtil();
}
Run Code Online (Sandbox Code Playgroud) 我在java中使用eclipse和编程.有时我遇到一个会让我困扰几个小时的nullPointerException.无论如何,更好地调试nullPointerExceptions并找出哪些变量值和其他会导致空指针异常的事情.
我有一个关于@NullableJava 中注释用法的问题.
根据我的阅读,设置可能返回null值的方法是一种很好的做法.通过这种方式,IDE可以帮助检测一些空指针异常错误,或建议删除不必要的空指针异常检查(如果@NotNull使用).
到目前为止这么好,但是如何使用@Nullable方法参数?这是一个好的做法还是代码变得更加冗长(如果与之一起使用final)并且可能会遗漏好处,因为您并不总是知道将哪些参数传递给函数调用?另外,您对使用@Nullablesetter方法有何看法?
用法与在公司工作时的情况有关,而与小型项目(如家庭作业)有关.
在我的服务中,我有一个受保护的构造函数@Inject和一个参数(提供者)@Nullable.任何想法,为什么我得到
com.google.inject.CreationException: Guice creation errors: 1) No implementation for [[service]] was bound.
?Guice是3.0pre1,@Nullable是我们的.