简体   繁体   中英

Right way to use the @NonNull annotation in Android Studio

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.

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. eg

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

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!");
}

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM