Я використовую винятки, щоб рано наздогнати проблеми. Наприклад:
public int getAverageAge(Person p1, Person p2){
if(p1 == null || p2 == null)
throw new IllegalArgumentException("One or more of input persons is null").
return (p1.getAge() + p2.getAge()) / 2;
}
Моя програма ніколи не повинна переходити null
на цю функцію. Я ніколи цього не маю намір. Однак, як ми всі знаємо, в програмуванні трапляються випадкові речі.
Якщо виникла ця проблема, викид, якщо ця проблема виникає, дозволяє мені виявити та виправити її, перш ніж вона спричинить більше проблем в інших місцях програми. Виняток зупиняє програму і каже мені, що "тут трапилися погані речі, виправте це". Замість цього null
переміщення по програмі спричиняє проблеми в інших місцях.
Тепер ви маєте рацію, у цьому випадку це null
просто спричинить NullPointerException
відразу, тому це може бути не найкращим прикладом.
Але розглянемо, наприклад, такий метод, як цей:
public void registerPerson(Person person){
persons.add(person);
notifyRegisterObservers(person); // sends the person object to all kinds of objects.
}
У цьому випадку null
параметр a як передається навколо програми, і може спричинити помилки набагато пізніше, які важко простежити до їх походження.
Зміна такої функції:
public void registerPerson(Person person){
if(person == null) throw new IllegalArgumentException("Input person is null.");
persons.add(person);
notifyRegisterObservers(person); // sends the person object to all kinds of objects.
}
Дозволяє мені помітити проблему набагато раніше, ніж вона спричинить дивні помилки в інших місцях.
Також null
посилання як параметр є лише прикладом. Це може бути багато видів проблем, від недійсних аргументів до чого-небудь іншого. Завжди краще помітити їх рано.
Тож моє запитання просто: це хороша практика? Чи добре використовувати виключення як інструменти для запобігання проблемам? Це законне застосування винятків чи це проблематично?