我希望使我的代码更具可读性,并使用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用于静态代码分析
文档
如果你有一个类接受一些参数但是不允许这些参数,那么最佳实践是null什么?
以下是显而易见的,但例外有点不明确:
public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null || two == null)
        {
            throw new IllegalArgumentException("Parameters can't be null");
        }
        //...
     }
}
这里的异常让你知道哪个参数为null,但构造函数现在非常难看:
public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null)
        {
            throw new IllegalArgumentException("one can't be null");
        }           
        if (two == null)
        {
            throw new IllegalArgumentException("two can't be null");
        }
        //...
  }
这里构造函数更整洁,但现在构造函数代码实际上不在构造函数中:
public class SomeClass
{
     public SomeClass(Object one, Object two) …什么是最好的 'NonNull'注释?
意义上的"最佳"
以下是世界目前的样子 - 任何进一步的见解都值得赞赏:
javax.validation.constraints.NotNull(Docs)
+ javax包因此看起来是未来的
-  JEE的一部分不是 JSE.在JSE中需要导入额外的库.
- 静态分析工具不支持(仅限运行时验证)
edu.umd.cs.findbugs.annotations.NonNull
- 外部库而不是javax包
- 不推荐使用,因为findbugs版本3.X 
+用于静态分析(由findbugs和Sonar提供)    
javax.annotation.Nonnull
+用于静态分析(在findbugs中)
- JSR-305处于休眠/死亡/未知状态,如fb邮件列表所示.提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......
org.eclipse.jdt.annotation_2.0.0
+用于静态分析(虽然在eclipse中不在findbugs中)
-  eclipse专有(没有尝试独立使用它们)
org.jetbrains.annotations.NotNull
+用于静态分析(虽然不是在findbugs 
中的IntelliJ )-  IntelliJ专有(但也可以公开作为jar)
lombok.NonNull(docs)
+用于控制代码生成
- 专有注释
android.support.annotation.NonNull(docs)
+ android …
我想@NonNull在Android中使用注释,但我无法找到正确的方法来实现它.我建议你这个例子:
public void doStuff(@NonNull String s){
     //do work with s...    
}
所以当我打电话doStuff(null)给IDE时会给我一个警告.问题是我不能依赖这个注释,因为像这个问题所指出的那样,它们不会传播得很远.所以我想对我的方法进行空检查,如下所示:
 if(s==null) throw new IllegalAgrumentException();
但是假设这个IDE s!=null会警告我s==null总是假的.我想知道最好的方法是什么.
我个人认为应该有一个注释@ShouldntBeNull,只有检查并警告null不会传递给它,但是当值为null时不会抱怨.
java ×4
annotations ×3
null ×2
android ×1
coding-style ×1
constructor ×1
eclipse ×1
ide ×1
non-nullable ×1