Подтвердить что ты не робот

Какова цель объектов # requireNonNull

После проверки JavaDocs для метода, который я думал использовать, requiredNonNull, я наткнулся на первый с единственным параметром (T obj).

Однако какова фактическая цель этого конкретного метода с этой подписью? Все, что он просто делает, - это бросок, и NPE, который я несколько позитивен (поскольку, возможно, мне не хватает чего-то очевидного здесь), все равно будет выброшено.

Броски:     NullPointerException - если obj равно null


Последнее действительно имеет смысл с точки зрения отладки определенного кода, поскольку, как указывает документ, он в первую очередь предназначен для проверки параметров

public static <T> T requireNonNull(T obj,String message)

Проверяет, что указанная ссылка на объект не является нулевой и выбрасывает исключение NullPointerException, если оно есть.

Поэтому я могу распечатать определенную информацию вместе с NPE, чтобы облегчить отладку.


Имея это в виду, я очень сомневаюсь, что столкнулся с ситуацией, когда я предпочел бы просто использовать прежний вариант. Пожалуйста, просветите меня.

tl; dr - Почему бы вам никогда не использовать перегрузку, которая не принимает сообщение.

4b9b3361

Ответ 1

Хорошим принципом при написании программного обеспечения является уловить ошибки как можно раньше. Чем быстрее вы заметите, например, плохое значение, например null, переданное методу, тем легче выяснить причину и устранить проблему.

Если вы передадите null методу, который не должен получать null, скорее всего произойдет NullPointerException, как вы уже заметили. Однако исключение может не произойти до тех пор, пока несколько методов не опустится ниже, и когда это произойдет где-то глубоко, будет труднее найти точный источник ошибки.

Итак, лучше, когда методы проверяют свои аргументы вперед и генерируют исключение, как только обнаруживают недопустимое значение, например null.

edit - О однопараметрической версии: даже если вы не укажете сообщение об ошибке, проверка аргументов и исключение исключения на раннем этапе будут более полезными, чем пропускать null, пока исключение не произойдет где-то глубже. Трассировка стека будет указывать на строку, в которой вы использовали Objects.requireNonNull(...), и это должно быть очевидно для вас как разработчика, что означает, что вы не должны пропускать null. Когда вы позволяете a NullPointerException произойти неявно, вы не знаете, имел ли исходный программист намерение, чтобы переменная не была null.