Речь здесь идет о выборе подхода к обработке ошибки, когда пользователь передал в non-nullable параметр значение
null.
Технически, оба этих исключения
unchecked, оба из стандартной библиотеки, и особой разницы нет.
Однако семантически эти исключения отличаются.
NullPointerException говорит пользователю о попытке обратиться к членам класса через null-ссылку. Это лишь техническое описание, без информации для пользователя о логике программы.
IllegalArgumentException, напротив, явно говорит о недопустимом значении аргумента – это понятная для пользователя информация.
Семантическая разница иногда проявляется и технически. Например, в обработчиках исключений некоторых фреймворков именно
IllegalArgumentException превращается в HTTP-ответ с кодом
400 Bad Request, в то время как NPE остается общим кодом «неизвестной ошибки»
500 Internal Server Error.
Кроме того, чтобы выбросить
NullPointerException не требуется явного кода обработки
null. Остается неизвестным, ожидаемо ли в этом случае исключение, или разработчик попросту забыл добавить корректную обработку.
Явная обработка
null и выброс
IllegalArgumentException для пользователя кода будет служить документацией, а сообщение об ошибке в аргументе его конструктора внесет еще больше ясности.