1.: Существует функция Objects.requireNonNull
, предназначенная именно для этой цели. Выдает исключение, если заданный аргумент равен null
.
if (messageDigest == null)
throw new IllegalArgumentException("messageDigest cannot be null");
должно быть просто
Objects.requireNonNull(messageDigest, "messageDigest cannot be null");
2.: Лучшая практика - генерировать исключение потому что null
означает бросить его , где null
не должно происходить на первом месте . Это мотивация принципа Fail Fast .
Когда появляется ссылка null
там, где она должна , а не , вы хотите бросить исключение или обработать его в точно в этом месте. Вы не хотите передать ссылку null
другим методам / функциям. В противном случае вам будет сложнее отладить код, если переданная ссылка null
вызовет проблемы в вашей программе. Это потому, что неясно, где ссылка null
возникла в первую очередь; но то, что на самом деле вызвало , это то, что вы хотите исправить / обработать. Пример:
public class Demo {
public void a(Object obj) {
b(obj);
}
private void b(Object obj) {
c(obj);
}
private void c(Object obj) {
// Calculation using obj.
}
}
Если ясно, что a
никогда не получит ссылку null
, это правильное место для проверки.
public void a(Object obj) {
Objects.requireNonNull(obj); // Throw exception when null.
b(obj);
}
Это плохо когда вы делаете проверку null
в каждом отдельном методе, потому что тот факт, что obj
не должно быть null
, учитывается для всех этих методов, поэтому достаточно поместить проверку null
там, где null
не должно происходят в первую очередь, то есть a
. Программа должна быстро провалиться .
Было бы еще хуже поставить null
в c
, потому что c
логически никогда не получит ссылку null
от b
и b
не должен получать один от a
. Если ссылка null
вызывает проблемы в c
, вам будет сложнее выяснить, произошло ли null
в b
или a
или коде, который вызвал a
. Вы хотите, чтобы знали об этом, потому что вы хотите решить проблему возникающей ссылки null
, , а не проблем, вызванных ею. Конечно, иногда вы не можете исправить сам случай, но вы можете попытаться подойти как можно ближе к этому событию и уменьшить побочный «ущерб», нанесенный им.
Реального способа перехода на другое место не существует null
проверок. Вы должны разместить их в нужных местах, чтобы программа быстро проваливалась при обнаружении недействительных объектов. Вам решать, где находятся лучшие места для null
проверок, потому что все зависит от конкретного случая.
Надеюсь, это даст вам хорошее представление о том, как подойти к этому.