Right way to use the @NonNull annotation in Android Studio

13,652

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

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

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

Share:
13,652

Related videos on Youtube

MMauro
Author by

MMauro

Updated on June 19, 2022

Comments

  • MMauro
    MMauro about 2 years

    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.

    • CommonsWare
      CommonsWare almost 9 years
      "I'd like to know what is the best way to do this" -- there should be a quick-fix in the IDE to suppress that warning. "I personally think..." -- you can file a feature request, if you like.
    • MMauro
      MMauro almost 9 years
      @CommonsWare There doesn't seem to be a quick SuppressWarning fix in Android Studio 1.3.2
    • CommonsWare
      CommonsWare almost 9 years
      Well, that stinks. :-(
    • MMauro
      MMauro almost 9 years
      Anyway I did as you suggested and filed a feature request. You can find it here