javajava-8nullpointerexception

Why should one use Objects.requireNonNull()?


I have noted that many Java 8 methods in Oracle JDK use Objects.requireNonNull(), which internally throws NullPointerException if the given object (argument) is null.

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

But NullPointerException will be thrown anyway if a null object is dereferenced. So, why should one do this extra null check and throw NullPointerException?

One obvious answer (or benefit) is that it makes code more readable and I agree. I'm keen to know any other reasons for using Objects.requireNonNull() in the beginning of the method.


Solution

  • Because you can make things explicit by doing so. Like:

    public class Foo {
      private final Bar bar;
    
      public Foo(Bar bar) {
        Objects.requireNonNull(bar, "bar must not be null");
        this.bar = bar;
      }
    

    Or shorter:

      this.bar = Objects.requireNonNull(bar, "bar must not be null");
    

    Now you know:

    Compare that to: you create a Foo object today, and tomorrow you invoke a method that uses that field and throws. Most likely, you will not know tomorrow why that reference was null yesterday when it got passed to the constructor!

    In other words: by explicitly using this method to check incoming references you can control the point in time when the exception will be thrown. And most of the time, you want to fail as fast as possible!

    The major advantages are: