Right way to use the @NonNull annotation in Android Studio

蓝咒 提交于 2019-11-29 11:25:13

问题


I'd like to use the @NonNull annotation in Android, but I can't figure out just the right way to do it. I propose you this example:

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

So when i call doStuff(null) the IDE will give me a warning. The problem is that I cannot rely on this annotation since, like this question points out, they don't propagate very far. So I'd like to put a null check on my method, like this:

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

But the IDE, assuming that s!=null, will warn me that s==null is always false. I'd like to know what is the best way to do this.

I personally think that there should be an annotation like @ShouldntBeNull that only checks and warns that null isn't passed to it, but doesn't complains when the value is null checked.


回答1:


You can use Objects.requireNonNull for that. It will do the check internally (so the IDE will not show a warning on your function) and raise a NullPointerException when the parameter is null:

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

If you want to throw another exception or use API level < 19, then you can just make your own helper-class to implement the same check. e.g.

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

and use it like so:

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



回答2:


Google examples do it as follows

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

...

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



回答3:


You can use the comment-style suppression to disable that specific null check warning, e.g.:

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

You'll need that //noinspection ConstantConditions every time you do it.



来源:https://stackoverflow.com/questions/32652402/right-way-to-use-the-nonnull-annotation-in-android-studio

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!