Як ми створюємо власні винятки на Java?
Як ми створюємо власні винятки на Java?
Відповіді:
Щоб визначити перевірений виняток, ви створюєте підклас (або ієрархію підкласів) java.lang.Exception
. Наприклад:
public class FooException extends Exception {
public FooException() { super(); }
public FooException(String message) { super(message); }
public FooException(String message, Throwable cause) { super(message, cause); }
public FooException(Throwable cause) { super(cause); }
}
Методи, які потенційно можуть кинути або поширити цей виняток, повинні оголосити його:
public void calculate(int i) throws FooException, IOException;
... і код, що викликає цей метод, повинен або обробляти, або розповсюджувати цей виняток (або обидва):
try {
int i = 5;
myObject.calculate(5);
} catch(FooException ex) {
// Print error and terminate application.
ex.printStackTrace();
System.exit(1);
} catch(IOException ex) {
// Rethrow as FooException.
throw new FooException(ex);
}
Ви помітите у наведеному вище прикладі, що IOException
спійманий і перекинутий як FooException
. Це звичайна методика, яка використовується для інкапсуляції винятків (як правило, при впровадженні API).
Іноді трапляються ситуації, коли ви не хочете змушувати кожен метод заявляти про свою реалізацію винятків у пункті про кидки. У цьому випадку ви можете створити неперевірений виняток. Неперевіреним винятком є будь-який виняток, який поширюється java.lang.RuntimeException
(що сам є підкласом java.lang.Exception
):
public class FooRuntimeException extends RuntimeException {
...
}
Методи можуть кидати або поширювати FooRuntimeException
виняток, не оголошуючи його; напр
public void calculate(int i) {
if (i < 0) {
throw new FooRuntimeException("i < 0: " + i);
}
}
Неперевірені винятки, як правило, використовуються для позначення помилки програміста, наприклад, передачі недійсного аргументу методу або спроби порушення меж індексу масиву.
java.lang.Throwable
Клас є коренем усіх помилок і виключень , які можуть бути викинуті в Java. java.lang.Exception
і java.lang.Error
є обома підкласами Throwable
. Все, що підкласи Throwable
можуть бути кинуті або спіймані. Однак, як правило, погана практика ловити або кидати, Error
оскільки це використовується для позначення внутрішніх помилок JVM, які зазвичай не можуть бути «оброблені» програмістом (наприклад OutOfMemoryError
). Точно так само ви повинні уникати лову Throwable
, що може привести до вас ловити Error
з на додаток до Exception
с.
Для перевіреного винятку:
public class MyCustomException extends Exception { }
Технічно все, що розширюється, Throwable
може бути кинутим, але винятки - це, як правило, розширення Exception
класу, щоб вони перевіряли винятки (за винятком RuntimeException або класів, заснованих на ньому, які не перевіряються), на відміну від іншого поширеного типу переданих, Error
s, які зазвичай не є чимось розробленим для того, щоб витончено обходитися поза внутрішніми можливостями JVM
Ви також можете робити винятки, що не є загальнодоступними, але тоді ви можете використовувати їх лише в тому пакеті, який визначає їх, на відміну від усіх пакунків.
Що стосується метання / вилучення спеціальних винятків, він працює так само, як і вбудовані - киньте через
throw new MyCustomException()
і зловити через
catch (MyCustomException e) { }
Throwable
може бути кинуто ; винятки поширюються Exception
. Спеціальний підклас Throwable не буде схоплений try { ... } catch (Exception e) { ... }
блоком.
Error
це не виняток, це помилка). 3) Це означає, що будь-який підклас винятку перевіряється, тоді як RuntimeException - ні. Відповідь, яку дав Адамський, набагато точніша!