54. Tackling the case null clause in switch
Before JDK 17, a null
case in a switch
was commonly coded as a guarding condition outside the switch
, as in the following example:
private static Player createPlayer(PlayerTypes playerType) {
// handling null values in a condition outside switch
if (playerType == null) {
throw new IllegalArgumentException(
"Player type cannot be null");
}
return switch (playerType) {
case TENNIS -> new TennisPlayer();
case FOOTBALL -> new FootballPlayer();
...
};
}
Starting with JDK 17+ (JEP 427), we can treat a null
case as any other common case. For instance, here we have a null
case that is responsible for handling the scenarios when the passed argument is null
:
private static Player createPlayer(PlayerTypes playerType) {
return switch (playerType) {
case TENNIS -> new TennisPlayer();
case FOOTBALL -> new FootballPlayer();
case SNOOKER -> new SnookerPlayer();
case null -> throw new NullPointerException(
"Player type cannot be null");
case UNKNOWN -> throw new UnknownPlayerException(
"Player type is unknown");
// default is not mandatory
default -> throw new IllegalArgumentException(
"Invalid player type: " + playerType);
};
}
In certain contexts, null
and default
have the same meaning, so we can chain them in the same case
statement:
private static Player createPlayer(PlayerTypes playerType) {
return switch (playerType) {
case TENNIS -> new TennisPlayer();
case FOOTBALL -> new FootballPlayer();
...
case null, default ->
throw new IllegalArgumentException(
"Invalid player type: " + playerType);
};
}
Or you might find it more readable like this:
...
case TENNIS: yield new TennisPlayer();
case FOOTBALL: yield new FootballPlayer();
...
case null, default:
throw new IllegalArgumentException(
"Invalid player type: " + playerType);
...
Personally, I suggest you think twice before patching your switch
expressions with case null
, especially if you plan to do it only for silently sweeping these values. Overall, your code may become brittle and exposed to unexpected behaviors/results that ignore the presence of null
values. In the bundled code, you can test the complete examples.