27

我想@NonNull在 Android 中使用注释,但我想不出正确的方法。我建议你这个例子:

public void doStuff(@NonNull String s){
     //do work with s...    
}

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

 if(s==null) throw new IllegalAgrumentException();

但是,假设 IDEs!=null会警告我这s==null总是错误的。我想知道这样做的最佳方法是什么。

我个人认为应该有一个这样的注释@ShouldntBeNull检查并警告 null 没有传递给它,但在检查值为 null 时不会抱怨。

4

3 回答 3

13

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

public MyMethod(@NonNull Context pContext) {
    Objects.requireNonNull(pContext);
    ...
}

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

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

并像这样使用它:

public MyMethod(@NonNull Context pContext) {
    Check.requireNonNull(pContext);
    ...
}
于 2016-10-03T09:50:54.623 回答
8

谷歌示例如下

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

...

public void doStuff(@NonNull String sParm){
     this.sParm= checkNotNull(s, "sParm cannot be null!");
}
于 2016-12-09T02:44:25.180 回答
7

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

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

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

于 2015-09-19T23:45:34.750 回答