相关疑难解决方法(0)

我应该使用哪个@NotNull Java注释?

我希望使我的代码更具可读性,并使用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用于静态代码分析
    文档

java ide null annotations nullpointerexception

918
推荐指数
20
解决办法
27万
查看次数

为什么缺少注释不会在运行时导致ClassNotFoundException?

请考虑以下代码:

A.java:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)

C.java:

import java.util.*;

@A public class C {
        public static void main(String[] args){
                System.out.println(Arrays.toString(C.class.getAnnotations()));
        }
}
Run Code Online (Sandbox Code Playgroud)

编译和运行按预期工作:

$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)

但是考虑一下:

$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)

我会期望它抛出一个ClassNotFoundException,因为@A缺少.但相反,它会默默地删除注释.

这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?

这样的事情似乎很方便javax.annotation.Nonnull(看起来应该是这样@Retention(CLASS)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.

java annotations

82
推荐指数
3
解决办法
1万
查看次数

javax.annotation.Nonnull vs assert

我在方法参数上使用Findbugs和javax.annotation.Nonnull.

在私有方法上,我通常添加一个断言行来检查null

private void myMethod(@Nonnull String str) {
    assert str != null
    ....
Run Code Online (Sandbox Code Playgroud)

最新的Netbeans版本(7.3rc2)报告断言检查不是必需的(因为Nonnull注释).我不完全确定这是一个Netbeans错误.

可以删除断言行,因为我指定了@Nonnull注释吗?

据我所知,注释仅在静态分析期间使用,而assert在启用时在执行期间处于活动状态,因此两个不是替代.

java assert findbugs null-check

14
推荐指数
2
解决办法
2万
查看次数