Чи повинен метод пошуку повернути 'null' або викинути виняток, коли він не може створити значення повернення? [зачинено]


503

У мене є метод, який повинен повернути об'єкт, якщо він знайдений.

Якщо його не знайти, чи слід:

  1. повернути null
  2. кинути виняток
  3. інший

57
Що б ви не робили, обов’язково документуйте це. Я думаю, що цей момент важливіший, ніж саме той підхід є "найкращим".
Рік

6
Це залежить від переважаючих ідіом мови програмування. Будь ласка, позначте це питання тегом мови програмування.
Тедді

3
Повернення нуля може означати лише успіх або невдачу, яка дуже часто не є великою кількістю інформації (деякі методи можуть бути невдалими багатьма способами). Бібліотеки повинні краще кидати винятки, щоб зробити явні помилки, і таким чином основна програма може вирішити, як виправити помилку на більш високому рівні (на відміну від вбудованої логіки обробки помилок).
3к-

1
Мені здається, що справжнє питання, яке ми задаємо, - чи слід вважати винятковим, що суб'єкт господарювання не може бути знайдений? Якщо так, то чому? Ніхто насправді не відповів достатньо, як дійти до цього висновку, і тепер питання і запитання закриті. Справжня ганьба, що галузь не дійшла консенсусу з цієї важливої ​​теми. Так, я знаю, що це залежить . Отже, поясніть, чому це залежить більше, ніж "якщо винятковий, киньте"
розчавити

Відповіді:


484

Якщо ви завжди розраховуєте знайти значення, тоді киньте виняток, якщо воно відсутнє. Виняток означав би, що виникла проблема.

Якщо значення може бути відсутнім або присутнім, і обидва є дійсними для логіки програми, тоді поверніть нуль.

Більш важливо: що ви робите в інших місцях у коді? Важлива послідовність.


30
@Ken: +1, було б непогано згадати, що якщо ви викинете виняток, але зможете виявити його апріорі (як HasItem (...)), тоді користувач повинен надати вказаний метод Has * або Contains.
user7116

4
Замість того, щоб повертати значення або null, коли значення відсутнє, розгляньте можливість повернення може бути <T>. Дивіться mikehadlow.blogspot.nl/2011/01/monads-in-c-5-maybe.html .
Erwin Rooijakkers

2
Як вибрати варіант дизайну @ErwinRooijakkers , з Java 8 ви також можете повернути Факультативний <T>
Хосе Андіас

2
Мені здається, що це трохи тривожно, кожна відповідь повторює одне і те ж прислів’я: "Якщо це винятково, киньте". Більшість інженерів знайомі з цим принципом. На мою думку, справжнє питання тут полягає в тому, як визначити, чи слід його вважати винятковим. ОП шукає найкращої практики, наприклад, щодо чогось типу сховища сховища. Чи типово вважається винятковим для того, що об'єкт не існує, надаючи первинний ключ? Так, саме це визначить його домен, але що пропонують більшість експертів із багаторічним досвідом? Це тип відповіді, який ми повинні бачити.
розчавити

4
@crush Я думаю, що керівним принципом є те, які параметри передаються функції . Якщо ви передаєте ідентифікатор , як ви згадуєте первинний ключ, його слід вважати винятковим, якщо цей елемент не знайдено, оскільки він вказує на несуперечливий стан у системі. Приклад: GetPersonById(25)кине, якщо цю особу буде видалено, але GetPeopleByHairColor("red")поверне порожній результат. Отже, я думаю, що параметри щось говорять про очікування.
Джон Кнуп

98

Виключення викидайте лише в тому випадку, якщо це справді помилка. Якщо очікується, що поведінка об'єкта не існує, поверніть нуль.

Інакше це питання переваги.


4
Я не згоден. Викиди можна викидати як коди статусу: "NotFoundException"
ACV

Це, звичайно, не повинно бути питанням уподобань. Ось так ми закінчуємо непослідовним кодом - якщо не серед коду вашої команди, то майже напевно при переплетенні коду інших розробників із вашим власним (зовнішні бібліотеки).
розчавити

4
Я думаю, що обробляти нульовий випадок набагато простіше, ніж "NotFoundException". Подумайте, скільки рядків пробного лову вам доводиться писати навколо кожного запиту на вилучення, який кидає "NotFoundException" ... Боляче готувати цей код у моїх очах.
visc

Я хотів би процитувати Тоні Хоара: "Я називаю це моєю помилкою в мільярд доларів". Я не повертаю null, я або кидаю виняток і правильно обробляю його, або повертаю порожній об’єкт.
сім

70

Як правило, якщо метод завжди повинен повертати об'єкт, тоді переходьте за винятком. Якщо ви передбачите випадковий нуль і хочете певним чином його обробити, перейдіть до нуля.

Що б ви не робили, я настійно раджу проти третього варіанту: повернення рядка з написом "WTF".


Плюс один, тому що в старі добрі часи я це робив більше, ніж пару разів, як швидко брудне "тимчасове" виправлення ... немає гарної ідеї. Особливо, якщо його буде переглянуто, якщо ви студент.
rciafardone

14
Я збирався відмовитись від голосування, оскільки варіанти WTF здалися мені приголомшливими ... але, мабуть, у мене є серце
прихватник

5
кинути новий WtfExcepti😲n
Kamafeather

Я думаю, було б корисно, якби ця відповідь розповідала про причини, чому метод завжди повертає об'єкт порівняно з "випадковим нулем". Що гарантує такий тип ситуації? Наведіть приклад, коли така обставина може існувати.
розчавити

51

Якщо null ніколи не вказує на помилку, просто поверніть null.

Якщо null - це завжди помилка, киньте виняток.

Якщо null іноді є винятком, тоді кодуйте дві підпрограми. Один звичайний викидає виняток, а інший - булева перевірка, яка повертає об'єкт у вихідний параметр, а підпрограма повертає помилку, якщо об'єкт не був знайдений.

Важко неправильно використати спробу рутини. Справді просто забути перевірити наявність нуля.

Отже, коли null - це помилка, ви просто пишете

object o = FindObject();

Коли null не є помилкою, ви можете кодувати щось на кшталт

if (TryFindObject(out object o)
  // Do something with o
else
  // o was not found

1
Це було б більш корисною пропозицією, якби C # надав справжні кортежі, тому ми могли б уникнути використання параметра [out]. І все-таки це найкращий зразок, тому +1.
Ерік Форбс

2
На мій погляд, підхід спробувати - найкращий. Тобі не потрібно шукати, що станеться, якщо об’єкт неможливо повернути. Використовуючи метод "Спробу", ви відразу знаєте, що робити.
OregonGhost

нагадує мені findі findOrFailвід Laravel Eloquent
vivoconunxino

@ErikForbes Я знаю, що ваш коментар давній, але чи не відповідь було б визначити об'єкт з множинними властивостями, який буде повернуто з TryFindObjectметоду? Кортежі здаються більшою мірою ледачою парадигмою для програмістів, які не хочуть витрачати час на визначення об'єкта, який інкапсулює декілька значень. Це по суті всі кортежі в будь-якому разі в основі.
розчавити

@crush - Іменовані кортежі - це варіант, IMO. Це посилання на асинхронну спробу "Get Get pattern" з кортежами. stackoverflow.com/questions/1626597 / ...
ttugates

26

Я просто хотів переказати варіанти, згадані раніше, кидаючи нові:

  1. повернути null
  2. кинути Виняток
  3. використовувати нульовий шаблон об'єкта
  4. надайте булевий параметр для вас методу, щоб абонент міг вибрати, чи хоче він викинути виняток
  5. надають додатковий параметр, щоб абонент може встановити значення, яке він отримує, якщо значення не знайдено

Або ви можете комбінувати ці варіанти:

Надайте декілька перевантажених версій вашого геттера, щоб абонент міг вирішити, яким шляхом піти. У більшості випадків лише перший має реалізацію алгоритму пошуку, а інші просто обертаються навколо першого:

Object findObjectOrNull(String key);
Object findObjectOrThrow(String key) throws SomeException;
Object findObjectOrCreate(String key, SomeClass dataNeededToCreateNewObject);
Object findObjectOrDefault(String key, Object defaultReturnValue);

Навіть якщо ви вирішите надати лише одну реалізацію, ви можете скористатись такою конвенцією про іменування для уточнення свого контракту, і це допоможе вам, якщо ви коли-небудь вирішите додати і інші реалізації.

Ви не повинні зловживати цим, але це може бути корисним, особливо при написанні допоміжного класу, який ви будете використовувати в сотнях різних додатків з багатьма різними умовами обробки помилок.


Мені подобаються чіткі назви функцій, особливо orCreate і orDefault.
marcovtwout

5
Більша частина цього може бути більш акуратно написані , Expected<T> findObject(String)де Expected<T>є функції orNull(), orThrow(), orSupplied(Supplier<T> supplier), orDefault(T default). Це
резюмує

Я досі не знав про Очікуване <T>. Я, здається, досить новий і, можливо, не існував, коли писав оригінальну відповідь. Можливо, ви повинні зробити свій коментар правильною відповіддю.
Лена Шіммель

Також очікуваний <T> шаблон C ++. Чи є його реалізація і в інших об'єктно-орієнтованих мовах?
Лена Шіммель

У Java 8 також є опцією повернення Необов’язковий <T> (на інших мовах його називають Можливо <T> тощо). Це чітко вказує абоненту, що повернення нічого не є можливістю, і не буде компілюватися, якщо абонент не обробив цю можливість, на відміну від нуля, який (у будь-якому випадку Java) буде компілювати, навіть якщо абонент не перевіряє це .
Якийсь Гай

18

Використовуйте нульовий шаблон об'єкта або киньте виняток.


Це справжня відповідь. Повернення нуля - жахлива звичка лінивих програмістів.
jeremyjjbrown

Я не можу повірити, що ця відповідь ще не проголосувала вгорі. Це справжня відповідь, і будь-який підхід є легким та легко економить безліч кодів або NPE.
Бейн


3
Якщо використовується нульовий шаблон об'єкта, то як би відрізнити випадок, коли ключ відображається на об’єкт null, від випадку, коли ключ не відображає? Я думаю, що повернення безглуздого об'єкта було б набагато гірше, ніж повернення нуля. Повернення null до коду, який не готовий обробити його, як правило, призведе до викидання виключення. Не найкращий вибір винятку, але все-таки виняток. Повернення безглуздого об'єкта, швидше за все, призведе до неправильного коду, який вважає безглузді дані правильними.
supercat

3
Як би поводився нульовий об'єкт для пошуку сутності? Наприклад, Person somePerson = personRepository.find("does-not-exist");припустимо, що цей метод повертає нульовий об'єкт для ID does-not-exist. Для чого тоді правильна поведінка somePerson.getAge()? Наразі я ще не впевнений, що нульовий шаблон об'єкта є правильним рішенням для пошуку сутностей.
Абдулл

13

Будьте відповідні API (API), який ви використовуєте.


13

Переваги кидання винятку:

  1. Потік управління чистотою у вашому коді виклику. Перевірка на наявність нуля вводить умовну гілку, якою в основному обробляється "try / catch". Перевірка на null не означає, що це ви перевіряєте - чи ви перевіряєте на null, тому що ви шукаєте помилку, яку ви очікуєте, чи ви перевіряєте null, щоб ви не передавали її далі на downchain ?
  2. Знімає неоднозначність того, що означає "null". Чи є null репрезентацією помилки чи є null тим, що насправді зберігається у значенні? Важко сказати, коли у вас є лише одна річ, на якій базуватиметься це визначення.
  3. Поліпшена узгодженість між поведінкою методу в додатку. Виключення, як правило, піддаються підписанням методів, тому ви більше зможете зрозуміти, які кращі регістри враховують методи у програмі та на яку інформацію ваша програма може реагувати передбачувано.

Детальніше з прикладами див. На веб-сторінці : http://metatations.com/2011/11/17/returning-null-vs-throwing-an-exception/


2
+1, оскільки точка 2 відмінна - null не має того самого значення, що і не знайдено. Це стає більш важливим при роботі з динамічними мовами, де Null насправді може бути об'єктом, який зберігається / отримується функцією - і в такому випадку
Адам Террі

1
+1 для точки №2. Чи нульова помилка? Чи є null те, що зберігається для даного ключа? Чи невідповідним є те, що ключ не існує? Це справжня лінія запитань, завдяки якій стає зрозумілим, що повернення нуля майже ніколи не є правильним. Це, мабуть, найкраща відповідь тут, оскільки всі інші щойно підкидали неоднозначне "Якщо це винятково, кинь"
розчавити

12

це залежить, якщо ваша мова та код рекламують: LBYL (подивіться, перш ніж стрибати) або EAFP (простіше просити пробачення, ніж дозволу)

LBYL каже, що ви повинні перевірити значення (тому поверніть нуль).
EAFP каже просто спробувати операцію і побачити, чи не вдалося вона (киньте виняток)

хоча я згоден з вище. Винятки повинні використовуватися для виключних умов / помилок, а повернення нуля найкраще використовувати під час перевірки.


EAFP vs. LBYL на Python:
http://mail.python.org/pipermail/python-list/2003-May/205182.html ( веб-архів )


3
У деяких випадках EAFP - єдиний змістовний підхід. Наприклад, у паралельній карті / словнику немає жодного способу запитати, чи буде існувати відображення, коли воно запитується.
supercat

11

Просто запитайте себе: "чи є винятковим випадком, що об'єкт не знайдений"? Якщо, як очікується, це відбудеться у звичайному процесі вашої програми, ви, ймовірно, не повинні створювати виняток (оскільки це не виняткова поведінка).

Коротка версія: використовуйте винятки для обробки виняткової поведінки, а не для управління нормальним потоком управління у вашій програмі.

-Алан.


5

Винятки пов'язані з дизайном за контрактом.

Інтерфейс об'єктів - це фактично договір між двома об'єктами, абонент повинен відповідати договору, інакше одержувач може просто вийти з винятку. Можливі два контракти

1) весь метод методу є дійсним, і тоді ви повинні повернути нуль, коли об'єкт не знайдений.

2) справедливий лише деякий вхід, тобто той, що призводить до знайденого об'єкта. У такому випадку ви ОБОВ'ЯЗКИ запропонувати другий метод, який дозволяє абоненту визначити, чи буде його введення правильним. Наприклад

is_present(key)
find(key) throws Exception

ЯКЩО і ТОЛЬКО, якщо ви надаєте обидва способи 2-го контракту, ви можете кинути виняток, нічого не знайдено!


4

Я вважаю за краще просто повернути нуль і покластися на абонента, щоб правильно його обробити. Виняток (за відсутності кращого слова) - якщо я абсолютно «певний», цей метод поверне об'єкт. У цьому випадку невдача є винятковою, що повинна і повинна кинути.


4

Залежить від того, що означає, що об’єкт не знайдено.

Якщо це нормальний стан справ, то поверніть нуль. Це просто щось, що може траплятися раз у раз, і абоненти повинні перевірити це.

Якщо це помилка, тоді киньте виняток, абоненти повинні вирішити, що робити зі станом помилки відсутнього об'єкта.

Зрештою, і це спрацювало б, хоча більшість людей взагалі вважають за добру практику використовувати Винятки лише тоді, коли щось, ну, Винятковий.


2
Як би ви детально розказали про твердження про " нормальний стан справ " та які критерії ви використаєте, щоб відрізнити це з помилкою.
користувач1451111

4

Ось ще пара пропозицій.

Якщо ви повертаєте колекцію, уникайте повернення нуля, поверніть порожню колекцію, що полегшує облік з попереднім перевіркою без нульової перевірки.

Декілька .NET API використовують шаблон параметру castOnError, який надає абоненту можливість вибору, чи справді це виняткова ситуація чи ні, якщо об'єкт не знайдений. Type.GetType - приклад цього. Ще одна поширена модель з BCL - це модель TryGet, де повертається булева інформація і передається значення через вихідний параметр.

Ви також можете розглянути шаблон нульового об’єкта за деяких обставин, які можуть бути або за замовчуванням, або версіями без поведінки. Ключ - уникнути нульових перевірок у всій базі коду. Дивіться тут для отримання додаткової інформації http://geekswithblogs.net/dsellers/archive/2006/09/08/90656.aspx


3

У деяких функціях я додаю параметр:

..., bool verify = true)

True означає кинути, false означає повернути деяке значення повернення помилки. Таким чином, той, хто використовує цю функцію, має обидва варіанти. За замовчуванням має бути правдою, на користь тим, хто забуває про помилки.


3

Поверніть нуль замість викидання виключення та чітко задокументуйте можливість повернення нульового значення в документації API. Якщо викликовий код не вшановує API і перевіряє нульовий випадок, то, швидше за все, це все одно призведе до якогось "виключення з нульовим покажчиком" :)

У C ++ я можу придумати 3 різні смаки налаштування методу, який знаходить об’єкт.

Варіант А

Object *findObject(Key &key);

Повернути нуль, коли об’єкт неможливо знайти. Приємно і просто. Я б пішов з цим. Альтернативні підходи, наведені нижче, призначені для людей, які не ненавидять зловживань.

Варіант В

void findObject(Key &key, Object &found);

Передайте посилання на змінну, яка буде отримувати об'єкт. Метод викинув виняток, коли об’єкт неможливо знайти. Ця умова, ймовірно, більше підходить, якщо насправді не очікується, що об’єкт не буде знайдений - значить, ви кидаєте виняток, щоб означати, що це несподіваний випадок.

Варіант С

bool findObject(Key &key, Object &found);

Метод повертає значення false, коли об'єкт не може бути знайдений. Перевага цього варіанту перед тим, що ви можете перевірити випадок помилки одним чітким кроком:

if (!findObject(myKey, myObj)) { ...

3

маючи на увазі лише той випадок, коли null не вважається винятковою поведінкою, я, безумовно, є методом спробу, зрозуміло, що не потрібно "читати книгу" чи "дивитися, перш ніж стрибати", як тут було сказано

так в основному:

bool TryFindObject(RequestParam request, out ResponseParam response)

а це означає, що код користувача також буде зрозумілим

...
if(TryFindObject(request, out response)
{
  handleSuccess(response)
}
else
{
  handleFailure()
}
...

2

Якщо для клієнтського коду важливо знати різницю між знайденим та не знайденим, і це має бути рутинною поведінкою, тоді найкраще повернути null. Потім клієнтський код може вирішити, що робити.


2

Як правило, він повинен повернутись до нуля. Код, що викликає метод, повинен вирішити, кинути виняток чи спробувати щось інше.


2

Або повернути Варіант

Опція - це клас контейнерів, який змушує клієнта обробляти шафи. У Scala є ця концепція, знайдіть API.

Тоді у вас є такі методи, як T getOrElse (T valueIfNull) на цьому об'єкті, або повернення знайденого об'єкта, або інтернативне, яке вказує клієнт.


2

Віддайте перевагу поверненню null -

Якщо абонент використовує його без перевірки, виняток трапляється прямо там же.

Якщо абонент насправді не використовує його, не оподатковуйте його try/ catchзаблокуйте


2

На жаль, JDK суперечить, якщо ви намагаєтеся отримати доступ до неіснуючого ключа в пакеті ресурсів, ви не знайдете винятку, і коли ви вимагаєте значення з карти, ви отримуєте нульове значення, якщо воно не існує. Тож я змінив би відповідь переможця на наступне, якщо знайдене значення може бути нульовим, тоді піднімемо виняток, коли воно не знайдено, інакше повернути нуль. Тож дотримуйтесь правила за одним винятком, якщо вам потрібно знати, чому значення не знайдено, то завжди піднімайте виняток, або ..


1

Поки він повинен повернути посилання на об'єкт, повернення NULL повинно бути хорошим.

Однак якщо вона повертає всю криваву річ (як, наприклад, у C ++, якщо ви робите: 'return blah;', а не 'return & blah;' (або 'blah' - вказівник), ви не можете повернути NULL, тому що це не типу "об'єкт". У такому випадку я б підійшов до проблеми, якщо викинути виняток або повернути порожній об'єкт, на якому не встановлено прапор успіху.


1

Не думайте, що хтось згадав про накладні витрати на обробку винятків - потребує додаткових ресурсів для завантаження та обробки винятку, якщо тільки справжня подія вбивства або зупинки процесу (подальший вперед не спричинить більше шкоди, ніж користі), я б вирішив повернути назад значення середовища, що викликає, може інтерпретувати так, як вважає за потрібне.


1

Я погоджуюся з тим, що тут здається консенсусом (повернути нуль, якщо "не знайдено" - це нормально можливий результат, або викинути виняток, якщо семантика ситуації вимагає, щоб об'єкт завжди знаходився).

Однак існує третя можливість, яка може мати сенс залежно від вашої конкретної ситуації. Ваш метод може повернути об'єкт за замовчуванням якогось типу в умові "не знайдено", що дозволяє виклику коду бути впевненим, що він завжди отримає дійсний об'єкт без необхідності перевірки нуля або вилучення виключень.


1

Поверніть нуль, винятки - це саме те, що ваш код робить, чого не очікується.



1

Якщо метод повертає колекцію, повертайте порожню колекцію (як сказано вище). Але, будь ласка, не Collections.EMPTY_LIST чи подібні! (у випадку з Java)

Якщо метод отримує один об'єкт, у вас є деякі варіанти.

  1. Якщо метод завжди повинен знаходити результат, і це справжній випадок виключення, щоб не знайти об'єкт, тоді вам слід викинути виняток (на Java: будь ласка, без перевірки Виняток)
  2. (Тільки для Java) Якщо ви можете допустити, що метод кидає перевірений виняток, киньте специфічний для проекту ObjectNotFoundException тощо. У цьому випадку компілятор каже вам, якщо ви забудете обробити виняток. (Це вподобане поводження з не знайденими речами на Java.)
  3. Якщо ви скажете, що це дійсно нормально, якщо об’єкт не знайдено, а ваше ім'я методу схоже на findBookForAuthorOrReturnNull (..), ви можете повернути null. У цьому випадку настійно рекомендується використовувати якусь статичну перевірку або перевірку компілятора, яка запобігає перенаправлення результату без нульової перевірки. У випадку з Java це може бути, наприклад. FindBugs (див. DefaultAnnotation за адресою http://findbugs.sourceforge.net/manual/annotations.html ) або IntelliJ-Checking.

Будьте уважні, якщо вирішите повернути нуль. Якщо ви не єдиний програміст у проекті, ви отримаєте NullPointerExceptions (на Java або що-небудь в інших мовах) під час виконання! Тому не повертайте нулі, які не перевіряються під час компіляції.


Не, якщо код був правильно написаний для очікування null. Докладнішу інформацію див. У відповіді.
Ендрю Барбер

Але лише якщо ви гарантуєте під час компіляції, що всі нулі перевіряються. Це можна зробити, використовуючи FindBugs @NutNull на рівні пакету і позначте ваш метод як "може повернути нуль". Або використовувати таку мову, як Котлін чи Ніцца. Але набагато простіше не повертати нуль.
iuzuz

"Простіше", можливо . Але часто очевидно неправильне
Ендрю Барбер

1
Знову ж таки: прочитайте відповідь, яку ви отримуєте з головою, щоб отримати додаткову інформацію. В основному: якщо потенційно очікуваний результат не може знайти запитувану книгу, виняток - це неправильне рішення, коли запитувана книга просто не знайдена, на відміну від помилки, що виникає.
Ендрю Барбер

1
Ви багато чого тут нерозумієте. Ви застосовуєте умовні поради універсально, що майже завжди погано робити. Прочитайте і решту відповідей, що проголосували. У вашій відповіді просто зазначено абсолютне значення і висувається надзвичайно неправильна логіка.
Ендрю Барбер

1

Якщо ви використовуєте бібліотеку чи інший клас, який видає виняток, вам слід повторно скинути її. Ось приклад. Example2.java - це як бібліотека, а Example.java використовує його об'єкт. Main.java - приклад для обробки цього Винятку. Ви повинні показати змістовне повідомлення та (за потреби) стеження стека користувачеві на стороні, що телефонує.

Main.java

public class Main {
public static void main(String[] args) {
    Example example = new Example();

    try {
        Example2 obj = example.doExample();

        if(obj == null){
            System.out.println("Hey object is null!");
        }
    } catch (Exception e) {
        System.out.println("Congratulations, you caught the exception!");
        System.out.println("Here is stack trace:");
        e.printStackTrace();
    }
}
}

Example.java

/**
 * Example.java
 * @author Seval
 * @date 10/22/2014
 */
public class Example {
    /**
     * Returns Example2 object
     * If there is no Example2 object, throws exception
     * 
     * @return obj Example2
     * @throws Exception
     */
    public Example2 doExample() throws Exception {
        try {
            // Get the object
            Example2 obj = new Example2();

            return obj;

        } catch (Exception e) {
            // Log the exception and rethrow
            // Log.logException(e);
            throw e;
        }

    }
}

Example2.java

 /**
 * Example2.java
 * @author Seval
 *
 */
public class Example2 {
    /**
     * Constructor of Example2
     * @throws Exception
     */
    public Example2() throws Exception{
        throw new Exception("Please set the \"obj\"");
    }

}

Якщо виняток, який буде викинуто з функції, не є винятком під час виконання програми, і абонент повинен працювати з ним (замість того, щоб просто завершити програму), а не викидати виключення з внутрішньої підсистеми, яку абонент не може очікувати, було б краще обернути внутрішній виняток зовнішнім перевіреним винятком, в той час як "прив'язувати" внутрішній виняток, щоб хтось із налагодження міг з'ясувати, чому зовнішній виняток був кинутий. Наприклад, example1 може використовувати 'кинути нову MyCheckedException ("Будь ласка, встановіть \" obj \ "", e)', щоб включити "e" до викинутого винятку.
Якийсь Гай

0

Це дійсно залежить від того, ви очікуєте знайти об'єкт, чи ні. Якщо ви слідуєте за школою думки, то для вказівки на щось слід використовувати винятки, то, помилка, винятковий стався тоді:

  • Об'єкт знайдено; повернути об’єкт
  • Об'єкт не знайдено; кинути виняток

В іншому випадку поверніть null.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.