Java null check why use == instead of .equals()

JavaNull

Java Problem Overview


In Java I am told that when doing a null check one should use == instead of .equals(). What are the reasons for this?

Java Solutions


Solution 1 - Java

They're two completely different things. == compares the object reference, if any, contained by a variable. .equals() checks to see if two objects are equal according to their contract for what equality means. It's entirely possible for two distinct object instances to be "equal" according to their contract. And then there's the minor detail that since equals is a method, if you try to invoke it on a null reference, you'll get a NullPointerException.

For instance:

class Foo {
    private int data;

    Foo(int d) {
        this.data = d;
    }

    @Override
    public boolean equals(Object other) {
        if (other == null || other.getClass() != this.getClass()) {
           return false;
        }
        return ((Foo)other).data == this.data;
    }

    /* In a real class, you'd override `hashCode` here as well */
}

Foo f1 = new Foo(5);
Foo f2 = new Foo(5);
System.out.println(f1 == f2);
// outputs false, they're distinct object instances

System.out.println(f1.equals(f2));
// outputs true, they're "equal" according to their definition

Foo f3 = null;
System.out.println(f3 == null);
// outputs true, `f3` doesn't have any object reference assigned to it

System.out.println(f3.equals(null));
// Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything

System.out.println(f1.equals(f3));
// Outputs false, since `f1` is a valid instance but `f3` is null,
// so one of the first checks inside the `Foo#equals` method will
// disallow the equality because it sees that `other` == null

Solution 2 - Java

if you invoke .equals() on null you will get NullPointerException

So it is always advisble to check nullity before invoking method where ever it applies

if(str!=null && str.equals("hi")){
 //str contains hi
}  

Also See

Solution 3 - Java

In addition to the accepted answer (https://stackoverflow.com/a/4501084/6276704):

Since Java 1.7, if you want to compare two Objects which might be null, I recommend this function:

Objects.equals(onePossibleNull, twoPossibleNull)

> java.util.Objects > > This class consists of static utility methods for operating on > objects. These utilities include null-safe or null-tolerant methods > for computing the hash code of an object, returning a string for an > object, and comparing two objects. > > Since: > 1.7

Solution 4 - Java

In Java 0 or null are simple types and not objects.

The method equals() is not built for simple types. Simple types can be matched with ==.

Solution 5 - Java

Object.equals is null safe, however be aware that if two objects are null, object.equals will return true so be sure to check that the objects you are comparing aren't null (or hold null values) before using object.equals for comparison.

String firstname = null;
String lastname = null;

if(Objects.equals(firstname, lastname)){
    System.out.println("equal!");
} else {
    System.out.println("not equal!");
}

Example snippet above will return equal!

Solution 6 - Java

foo.equals(null)

What happens if foo is null?

You get a NullPointerException.

Solution 7 - Java

If an Object variable is null, one cannot call an equals() method upon it, thus an object reference check of null is proper.

Solution 8 - Java

If you try calling equals on a null object reference, then you'll get a null pointer exception thrown.

Solution 9 - Java

According to sources it doesn't matter what to use for default method implementation:

public boolean equals(Object object) {
    return this == object;
}

But you can't be sure about equals in custom class.

Solution 10 - Java

If we use=> .equals method

if(obj.equals(null))  

// Which mean null.equals(null) when obj will be null.

When your obj will be null it will throw Null Point Exception.

so we should use ==

if(obj == null)

it will compare the references.

Solution 11 - Java

here is an example where str != null but str.equals(null) when using org.json

 JSONObject jsonObj = new JSONObject("{field :null}");
 Object field = jsonObj.get("field");
 System.out.println(field != null);        // => true
 System.out.println( field.equals(null)); //=> true
 System.out.println( field.getClass());  // => org.json.JSONObject$Null




EDIT: here is the org.json.JSONObject$Null class:

/**
 * JSONObject.NULL is equivalent to the value that JavaScript calls null,
 * whilst Java's null is equivalent to the value that JavaScript calls
 * undefined.
 */
private static final class Null {

    /**
     * A Null object is equal to the null value and to itself.
     *
     * @param object
     *            An object to test for nullness.
     * @return true if the object parameter is the JSONObject.NULL object or
     *         null.
     */
    @Override
    public boolean equals(Object object) {
        return object == null || object == this;
    }  
}

Solution 12 - Java

Because equal is a function derived from Object class, this function compares items of the class. if you use it with null it will return false cause cause class content is not null. In addition == compares reference to an object.

Solution 13 - Java

So I never get confused and avoid problems with this solution:

if(str.trim().length() <=0 ) {
   // is null !
}

Solution 14 - Java

I have encountered this case last night.
I determine that simply that: >Don't exist equals() method for null
So, you can not invoke an inexistent method if you don't have
-->>> That is reason for why we use == to check null

Solution 15 - Java

You code breaks Demeter's law. That's why it's better to refactor the design itself. As a workaround, you can use Optional

   obj = Optional.ofNullable(object1)
    .map(o -> o.getIdObject11())
    .map(o -> o.getIdObject111())
    .map(o -> o.getDescription())
    .orElse("")

above is to check to hierarchy of a object so simply use

Optional.ofNullable(object1) 

if you have only one object to check

Hope this helps !!!!

Solution 16 - Java

You could always do

if (str == null || str.equals(null))

This will first check the object reference and then check the object itself providing the reference isnt null.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJim JeffriesView Question on Stackoverflow
Solution 1 - JavaT.J. CrowderView Answer on Stackoverflow
Solution 2 - JavajmjView Answer on Stackoverflow
Solution 3 - JavaTigerwareView Answer on Stackoverflow
Solution 4 - Javauser523859View Answer on Stackoverflow
Solution 5 - Javachin90View Answer on Stackoverflow
Solution 6 - JavaNick OrtonView Answer on Stackoverflow
Solution 7 - JavaJé QueueView Answer on Stackoverflow
Solution 8 - JavaA_MView Answer on Stackoverflow
Solution 9 - JavaDixonDView Answer on Stackoverflow
Solution 10 - JavaAKTView Answer on Stackoverflow
Solution 11 - JavadinaView Answer on Stackoverflow
Solution 12 - Javadanny.lesnikView Answer on Stackoverflow
Solution 13 - JavaMatheus MarquesView Answer on Stackoverflow
Solution 14 - JavaNeo_View Answer on Stackoverflow
Solution 15 - JavaAkitha_MJView Answer on Stackoverflow
Solution 16 - JavaKevin OrrissView Answer on Stackoverflow