Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I make IntelliJ IDEA understand my null-checking method?

I have a method where a parameter is marked with the @Nonnull annotation. The code which calls the method has to check whether the value is null. Rather than just a straight x != null check, it is calling a utility method on another class. (In the real code, the utility method also checks whether it is a blank String).

My problem is that Intellij Idea is showing an inspection warning on the Nonnull method call, saying that my variable "might be null". I know it cannot be null because of the utility method check - how can I tell the inspector that?

Since that is a bit abstract, here's a minimal example of what I mean:

package org.ethelred.ideatest;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

/**
 * tests annotations
 */
public class AnnotationChecker
{
    public static void main(String[] args)
    {
        String x = null;
        if(args.length > 0)
        {
            x = args[0];
        }

        if(!isNull(x))
        {
            useObject(x);
        }

        if(x != null)
        {
            useObject(x);
        }
    }

    public static boolean isNull(@CheckForNull Object o)
    {
        return o == null;
    }


    public static void useObject(@Nonnull Object o)
    {
        System.out.println(o);
    }
}

This uses the JSR 305 annotations.

In this example, in the first call to useObject Intellij puts a warning on the x parameter saying "Argument 'x' might be null". In the second call, there is no warning.

like image 213
Edward Harman Avatar asked May 17 '12 13:05

Edward Harman


2 Answers

In IDEA 13 very fancy feature was added, called Method Contracts. For example, you could have a method, that throws validation exception if it encounters null:

@Contract("null -> fail")
public static void validateNull(@Nullable final Object object) {
    if (object == null) {
        throw new ValidationException();
    }
}

IDEA will analyze the annotation and won't show up warnings, if you call it before possible NPE:

validateNull(user);
user.setSomething("something"); // no warning

You have full documentation in IDEA's settings (just search for Method Contract). For this to work you need additional dependency on jetbrain's annotations jar:

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>13.0</version>
</dependency>
like image 197
mareckmareck Avatar answered Nov 15 '22 16:11

mareckmareck


With IDEA 12 you can configure the NotNull-check methods: http://youtrack.jetbrains.com/issue/IDEA-35808#tab=Comments

like image 35
Max Avatar answered Nov 15 '22 17:11

Max