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

MMa*_*uro 25 java android annotations non-nullable

我想@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时不会抱怨.

TmT*_*ron 13

您可以使用Objects.requireNonNull.它将在内部进行检查(因此IDE不会在您的函数上显示警告)并在参数为时引发NullPointerExceptionnull:

public MyMethod(@NonNull Context pContext) {
    Objects.requireNonNull(pContext);
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果要抛出另一个异常或使用API​​级别<19,那么您可以创建自己的帮助类来实现相同的检查.例如

public class Check {
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new IllegalArgumentException();
        return obj;
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

public MyMethod(@NonNull Context pContext) {
    Check.requireNonNull(pContext);
    ...
}
Run Code Online (Sandbox Code Playgroud)


use*_*108 8

Google的示例如下所示

import static com.google.common.base.Preconditions.checkNotNull;

...

public void doStuff(@NonNull String sParm){
     this.sParm= checkNotNull(s, "sParm cannot be null!");
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*ell 6

您可以使用注释样式抑制来禁用该特定的空检查警告,例如:

    public MyMethod(@NonNull Context pContext) {
        //noinspection ConstantConditions
        if (pContext == null) {
            throw new IllegalArgumentException();
        }
        ...
    }
Run Code Online (Sandbox Code Playgroud)

//noinspection ConstantConditions每次你这样做都需要它.