2015-01-21 2 views
0

Моя система имеет эти классы:Какой лучший слой обрабатывает исключение NullPointerException?

PersonBean - handles the requests from the view; 
PersonService - provides all operations for the PersonBeam; 
PersonDao - provides data acess from db to Service classes; 

У меня есть findById(int personId) метод на моем PersonDao классе. Когда PersonDao не может найти Person с предоставленным Id, он возвращает Null. Где я должен обращаться с Null? В каком слое?

Благодаря

+1

Я бы обрабатывал NPE из уровня данных (например, сущности) и вверх (уровень доступа, уровень обслуживания и т. Д.). Вы должны помнить, что NPE могут быть выброшены в разные слои, как указано ниже, @mnd – ha9u63ar

ответ

2

Я хотел бы сказать, что нулевой должен быть передан назад, насколько это возможно в стеке, так что он может быть обработан на каждом уровне по-разному, если это необходимо (и в зависимости от пути к PersonDao, если он отличается в других областях кода). В этом случае я считаю, что имеет смысл обрабатывать null в PersonBean.

Это все при условии, что вы только говорите о null ссылки, а не NullPointerException, если бы это было так, обрабатывать ее на самом низком уровне, который был бы PersonDao.

1

На этот вопрос нет «правильного» ответа. Однако, может быть, я могу дать некоторые советы.

Не поймайте его на уровне хранилища, так как возвращение null является обычной практикой, когда чего-то не существует. Что касается того, где его обрабатывать, он не должен быть обращен к пользователю, и вы также не хотите беспокоиться о том, может ли он быть пустым в нескольких областях приложения.

Итак, выберите нижний слой, в котором вы можете обращаться с ним соответствующим образом (потому что у вас достаточно информации о том, почему вы его запрашиваете), поэтому вам не нужно иметь дело с ним повсюду. Альтернативой, будет определять методы обслуживания, такие как:

getIfExists(String id), которые могут возвращать нуль, и get(String id), что будет сгенерировано исключение, если нуль (если вы когда-либо запросов, где вы знаете, что идентификатор должен соответствовать пользователю и что-то если это не так).

1

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

Hibernate (например) имеет два метода поиска: get и load. load выдает исключение, если запись не может быть найдена, тогда как get возвращает null. Таким образом, вы можете использовать аналогичный подход. Это делает подразумеваемым в контракте, что один метод ожидает, что запись будет найдена, а другая - нет.

Насколько куда обращаться с этим, если вы возвращаете null, то я бы справиться с этим в самом дальнем слое назад, то есть на уровне, где вы на самом деле просите экземпляр Person. Только на этом уровне вы можете сделать информативное решение относительно того, что делать с экземпляром nullPerson.

Если вы считаете, что поиск записи не является исключительным случаем, тогда я бы выбрал исключение (как я уже упоминал ранее, а не NullPointerException, но какое-то другое исключение, из которого следует, что запись не была найдена), когда запись не найдена ,

Смежные вопросы