相关疑难解决方法(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万
查看次数

Java构造函数样式:检查参数不为null

如果你有一个类接受一些参数但是不允许这些参数,那么最佳实践是null什么?

以下是显而易见的,但例外有点不明确:

public class SomeClass
{
     public SomeClass(Object one, Object two)
     {
        if (one == null || two == null)
        {
            throw new IllegalArgumentException("Parameters can't be null");
        }
        //...
     }
}
Run Code Online (Sandbox Code Playgroud)

这里的异常让你知道哪个参数为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");
        }
        //...
  }
Run Code Online (Sandbox Code Playgroud)

这里构造函数更整洁,但现在构造函数代码实际上不在构造函数中:

public class SomeClass
{
     public SomeClass(Object one, Object two) …
Run Code Online (Sandbox Code Playgroud)

java null constructor coding-style

69
推荐指数
4
解决办法
6万
查看次数

使用哪个@NonNull Java注释

什么是最好的 'NonNull'注释?

意义上的"最佳"

  • 标准方式,例如未来证明(例如标准jdk支持等)
  • 支持IDE(在java doc中显示以指示开发人员的使用情况)
  • 由findbugs等静态分析工具提供支持
  • 支持运行时分析

以下是世界目前的样子 - 任何进一步的见解都值得赞赏:

  • javax.validation.constraints.NotNull(Docs)
    + javax包因此看起来是未来的
    - JEE的一部分不是 JSE.在JSE中需要导入额外的库.
    - 静态分析工具不支持(仅限运行时验证)

  • edu.umd.cs.findbugs.annotations.NonNull(docs)
    - 外部库而不是javax
    - 不推荐使用,因为findbugs版本3.X
    +用于静态分析(由findbugs和Sonar提供)

  • javax.annotation.Nonnull(docs)
    +用于静态分析(在findbugs中)
    - JSR-305处于休眠/死亡/未知状态,如fb邮件列表所示.提交人Bill Pugh,即使直接被问到,多年来也没有对该州进行评论......

  • org.eclipse.jdt.annotation_2.0.0(文档,有趣的演示文稿)
    +用于静态分析(虽然在eclipse中不在findbugs中)
    - eclipse专有(没有尝试独立使用它们)

  • org.jetbrains.annotations.NotNull(docs)
    +用于静态分析(虽然不是在findbugs
    中的IntelliJ )- IntelliJ专有(但也可以公开作为jar)

  • lombok.NonNull(docs)
    +用于控制代码生成
    - 专有注释

  • android.support.annotation.NonNull(docs)
    + android …

java eclipse annotations intellij-idea nullpointerexception

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

在Android Studio中使用@NonNull注释的正确方法

我想@NonNull在Android中使用注释,但我无法找到正确的方法来实现它.我建议你这个例子:

public void doStuff(@NonNull String s){
     //do work with s...    
}
Run Code Online (Sandbox Code Playgroud)

所以当我打电话doStuff(null)给IDE时会给我一个警告.问题是我不能依赖这个注释,因为像这个问题所指出的那样,它们不会传播得很远.所以我想对我的方法进行空检查,如下所示:

 if(s==null) throw new IllegalAgrumentException();
Run Code Online (Sandbox Code Playgroud)

但是假设这个IDE s!=null会警告我s==null总是假的.我想知道最好的方法是什么.

我个人认为应该有一个注释@ShouldntBeNull,只有检查并警告null不会传递给它,但是当值为null时不会抱怨.

java android annotations non-nullable

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