The overload of requireNonNull that takes a Supplier<String> only builds the failure message when the value is actually null, avoiding the cost of assembling a message string on every successful call.
int[] messagesBuilt = {0};
Supplier<String> lazyMessage = () -> {
messagesBuilt[0]++;
return "name must not be null";
};
Objects.requireNonNull("Ada", lazyMessage);
System.out.println("Messages built after a valid call: " + messagesBuilt[0]);
try {
Objects.requireNonNull(null, lazyMessage);
} catch (NullPointerException e) {
System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
}
System.out.println("Messages built after a failing call: " + messagesBuilt[0]);
Messages built after a valid call: 0
NullPointerException: name must not be null
Messages built after a failing call: 1
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-09-27