Overview

In this little article, we will see how to get the string representation(tostring) of an object cautiously, that means avoiding NullPointerException.

Context

Getting the String representation of a Java object is something we often do for logging, debugging, or simply for overview purpose.

For a null object we will be directed to a NullPointerException, as the toString is using the fields of the object.

A catch up of this without even check for nullity before is just by using the String.valueOf(object) method instead of directly using object.toString().

Here is the content of String.valueOf generated by IntelliJ:

/**
 * Returns the string representation of the {@code Object} argument.
 *
 * @param   obj   an {@code Object}.
 * @return  if the argument is {@code null}, then a string equal to
 *          {@code "null"}; otherwise, the value of
 *          {@code obj.toString()} is returned.
 * @see     java.lang.Object#toString()
 */
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

Where it's clearly described how the null is catches on before the toString.

This function is also wrapped up into the Objects utility function accessible via the: Objects.toString(Object o), more readable.

A real live example

Let's suppose your application logic, among others, is using two models with some properties where one depends on the other:

  • ObjectB: propB
  • ObjectA: propA, objectB1 and objectB2

Considering that the dependency objectB2 is optional and somewhere in your code you would like to toString each property of ObjectA(even the optional one).

Here is an approach without the need of checking for nullity:

ObjectB class:

public class ObjectB {
    private String propB;

    public ObjectB(String propB) {
        this.propB = propB;
    }

    // Getters and setters

    @Override
    public String toString() {
        return "ObjectB{" +
                "propB='" + propB + '\'' +
                '}';
    }
}

ObjectA class has objectB2 as an optional property:

public class ObjectA {
    private String propA;
    private ObjectB objectB1;
    private ObjectB objectB2;

    public ObjectA(String propA, ObjectB objectB1) {
        this.propA = propA;
        this.objectB1 = objectB1;
    }

    // Getters and setters

    @Override
    public String toString() {
        return "ObjectA{" +
                "propA='" + propA + '\'' +
                ", objectB1=" + Objects.toString(objectB1) +
                ", objectB2=" + Objects.toString(objectB2) +
                '}';
    }
}

The following JUnit test illustrates how we now proceed to come out with a safe string representation of ObjectA's instances:

@Test
public void safeToStringTest() {
    ObjectB objectB = new ObjectB("Fake propB");
    ObjectA objectA = new ObjectA("Fake propA", objectB);

    String stringObjectA = Objects.toString(objectA);
    System.out.println(stringObjectA);

    assertNull(objectA.getObjectB2());
    assertTrue(stringObjectA.contains("objectB2=null"));
}

The printed string of our ObjectA into the console is:

ObjectA{propA='Fake propA', objectB1=ObjectB{propB='Fake propB'}, objectB2=null}

More usages of the Objects class can be found on this page.

Conclusion

To sum up, we have seen here a proper way to safely toString an object with embed properties.

As usual, the code is available in the GitHub repo.

Categories: Java

Dassi Orleando

Dassi Orleando

Full-Stack developer by formation and profession, fixer, driver, entrepreneur, freelancer and passionate about all around IT, I love implement or use different things all the days. If you would like to contact or follow me, you can do so below.

Related Posts

Java

JDK 7 Objects class: Check Nullity and throw NPE

Introduction In a developer life, we always have some places in the code where we test for an object to not be null before continuing a workflow or an action, it's safe to do it Read more...

Shares