Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to tell IDEA/Studio that the null check has been done?

I'm developing with Android Studio/IntelliJ IDEA.

I have enabled the inspection check called "Constant conditions & exceptions" that shows a warning if I am risking a NPE, such as:

String foo = foo.bar(); // Foo#bar() is @nullable
if (foo.contains("bar")) { // I'm living dangerously
    ...
}

I have the following in my code:

String encoding = contentEncoding == null ? null : contentEncoding.getValue();
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
    inputStream = new GZIPInputStream(entity.getContent());
} else {
    inputStream = entity.getContent();
}

Here's the source code of TextUtils#isEmpty(String):

/**
 * Returns true if the string is null or 0-length.
 * @param str the string to be examined
 * @return true if str is null or zero length
 */
public static boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

I'm not risking any NPE because TextUtils#isEmpty(String) would return true to a null pointer.

However I'm still getting the little Method invocation 'encoding.equalsIgnoreCase("gzip")' may produce 'java.lang.NullPointerException' warning, which can be annoying.

Is it possible to make this check smarter and ignore the NPE warning if there's already a null-check done?

like image 999
Benoit Duffez Avatar asked Oct 10 '13 17:10

Benoit Duffez


6 Answers

  1. Select "TextUtils.isEmpty".
  2. Right Click -> Show Context Actions -> Add Method Contract.
  3. Enter "null -> true".
  4. Save the configuration xml.

Please check the details here

like image 126
Rahul Kumar Avatar answered Nov 03 '22 12:11

Rahul Kumar


Unfortunately marked as "right answer" solution is of date. But I found equivalent for me solution.

The new versions of IDE work correctly with static methods. So the example from the question won't throw warning anymore.

TextUtils#isEmpty(String);

public static boolean isEmpty(CharSequence str) {
    // your checks
}
like image 26
Chuck Avatar answered Sep 20 '22 12:09

Chuck


You can use @SuppressWarnings("ConstantConditions") annotation.

@SuppressWarnings("ConstantConditions")
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int indexViewType) {
    if (inflater == null) {
        inflater = LayoutInflater.from(parent.getContext());
    }
    ItemViewProvider provider = getProviderByIndex(indexViewType);
    provider.adapter = MultiTypeAdapter.this;
    return provider.onCreateViewHolder(inflater, parent);
}
like image 40
jk2K Avatar answered Nov 03 '22 10:11

jk2K


You can look into the link that Peter Gromov mention in his answer.

Created some simple classes that resemble your setup:

A class with a method annotated with @Nullable:

enter image description here

The TextUtil class with it's isEmpty method:

enter image description here

And finally the main class calling the TextUtil#isEmpty:

enter image description here

Now if you enter the File -> Settings... and go to Inspections ->Constant conditions & exceptions part you can change the Configure Assert/Check Methods to cater for your isEmpty method:

enter image description here

Add a new IsNull check method:

enter image description here

Enter the TextUtil class, isEmpty method and CharSequence parameter:

enter image description here

This gives this Assert/Check Method Configuration window:

enter image description here

Press Ok and then Ok again to go back to the editor view and you'll see that the inspection disappeared:

enter image description here

You are actually telling IntelliJ that the isEmpty method is doing a null check on the str parameter.

like image 19
maba Avatar answered Nov 03 '22 10:11

maba


You could use //noinspection ConstantConditions that will remove the NPE warning for the following line, like this:

String encoding = contentEncoding == null ? null : contentEncoding.getValue();

//noinspection ConstantConditions
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
    inputStream = new GZIPInputStream(entity.getContent());
} else {
    inputStream = entity.getContent();
}
like image 10
Olivier Payen Avatar answered Nov 03 '22 10:11

Olivier Payen


See http://www.jetbrains.com/idea/webhelp/configuring-check-assert-methods.html for IDEA 12. In IDEA 13 EAP, you can add method contract: http://youtrack.jetbrains.com/issue/IDEA-93372

like image 1
Peter Gromov Avatar answered Nov 03 '22 11:11

Peter Gromov