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

28

我想在安卓中使用@NonNull注释,但我不知道正确的使用方式。我给你提供一个例子:

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

因此,当我调用 doStuff(null)时,IDE 会给我一个警告。问题是我不能依赖这个注释,因为正如这个问题指出的那样,它们的传播范围有限。所以我想在我的方法上加入空值检查,就像这样:

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

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

我个人认为应该有一个注解@ShouldntBeNull仅仅检查是否传递了null,并警告,但当值被空检查时,不会报错。


1
“我想知道最好的方法是什么” - 在IDE中应该有一个快速修复来抑制那个警告。 “我个人认为…” - 如果您愿意,可以提交功能请求 - CommonsWare
@CommonsWare 在Android Studio 1.3.2中似乎没有快速的SuppressWarning修复方法。 - MMauro
好吧,那很糟糕。 :-( - CommonsWare
1
无论如何,我按照你的建议提交了一个功能请求。您可以在此处找到它。 - MMauro
3个回答

13

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

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);
    ...
}

8

Google的示例是这样做的:

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

...

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

7
您可以使用注释方式来禁用特定的空值检查警告,例如:
    public MyMethod(@NonNull Context pContext) {
        //noinspection ConstantConditions
        if (pContext == null) {
            throw new IllegalArgumentException();
        }
        ...
    }

每次进行此操作时,您都需要使用 //noinspection ConstantConditions


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接