Вам нужно подумать, не найти ли человека исключительный случай. Это что-то, что происходит вне нормального программного потока? Если это так, я бы выбрал семантически допустимое исключение, из которого следует, что запись не найдена.
Hibernate (например) имеет два метода поиска: get
и load
. load
выдает исключение, если запись не может быть найдена, тогда как get
возвращает null
. Таким образом, вы можете использовать аналогичный подход. Это делает подразумеваемым в контракте, что один метод ожидает, что запись будет найдена, а другая - нет.
Насколько куда обращаться с этим, если вы возвращаете null
, то я бы справиться с этим в самом дальнем слое назад, то есть на уровне, где вы на самом деле просите экземпляр Person
. Только на этом уровне вы можете сделать информативное решение относительно того, что делать с экземпляром null
Person
.
Если вы считаете, что поиск записи не является исключительным случаем, тогда я бы выбрал исключение (как я уже упоминал ранее, а не NullPointerException
, но какое-то другое исключение, из которого следует, что запись не была найдена), когда запись не найдена ,
Я бы обрабатывал NPE из уровня данных (например, сущности) и вверх (уровень доступа, уровень обслуживания и т. Д.). Вы должны помнить, что NPE могут быть выброшены в разные слои, как указано ниже, @mnd – ha9u63ar