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