Ось дуже просте рішення вашої дилеми "Перевірена / перевірена".
Правило 1: Подумайте про неперевірений виняток як пробну умову перед виконанням коду. наприклад…
x.doSomething(); // the code throws a NullPointerException
де x дорівнює нулю ... ... код, можливо, повинен мати наступне ...
if (x==null)
{
//do something below to make sure when x.doSomething() is executed, it won’t throw a NullPointerException.
x = new X();
}
x.doSomething();
Правило 2: Подумайте про перевірений виняток як про неперевірену умову, яка може виникнути під час виконання коду.
Socket s = new Socket(“google.com”, 80);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
… У наведеному вище прикладі URL-адреса (google.com) може бути недоступною через зниження сервера DNS. Навіть у той момент, коли сервер DNS запрацював і вирішив ім'я "google.com" на IP-адресу, якщо з'єднання буде зроблено з google.com, у будь-який час після нього слово може зайти. Ви просто не можете протестувати мережу весь час перед читанням і записом у потоки.
Бувають випадки, коли код просто повинен виконуватися, перш ніж ми зможемо знати, чи є проблема. Змушуючи розробників писати свій код таким чином, щоб змусити їх вирішувати ці ситуації за допомогою перевіреного винятку, я маю підказати шапку творцю Java, який винайшов цю концепцію.
Взагалі майже всі API на Java дотримуються 2 правил, наведених вище. Якщо ви спробуєте записати у файл, диск може заповнитись перед завершенням запису. Можливо, що інші процеси спричинили заповнення диска. Тестування на цю ситуацію просто немає. Для тих, хто взаємодіє з обладнанням, де в будь-який час використання апаратури може вийти з ладу, перевірені винятки здаються елегантним рішенням цієї проблеми.
До цього є сіра зона. У випадку, якщо потрібно багато тестів (думка, якщо висловлювання з великою кількістю && і ||), виняток буде вивіреним CheckedException просто тому, що це занадто багато болю, щоб виправитись - ви просто не можете сказати цю проблему - помилка програмування. Якщо є набагато менше 10 тестів (наприклад, 'if (x == null)'), помилка програміста повинна бути UncontException.
Речі стають цікавими при спілкуванні з перекладачами мови. Відповідно до вищезазначених правил, чи слід вважати помилку синтаксису винятком, що перевіряється чи не перевіряється? Я можу стверджувати, що якщо синтаксис мови можна перевірити до того, як він буде виконаний, це повинен бути UncontException. Якщо мова не може бути перевірена - подібно до того, як працює збірний код на персональному комп’ютері, то помилка синтаксису повинна бути перевіреною винятком.
2 вищевказані правила, ймовірно, знімуть 90% вашої турботи, щодо чого вибрати. Щоб узагальнити правила, дотримуйтесь цього шаблону ... 1) якщо код, який потрібно виконати, може бути протестований перед його виконанням для його правильного запуску, і якщо виняток виникає - він же помилка програміста, виняток повинен бути UncontException (підклас RuntimeException ). 2) якщо код, який потрібно виконати, не може бути перевірений перед його правильним виконанням для його правильного запуску, виняток повинен бути перевіреним винятком (підклас винятку).