Як створити спеціальні винятки на Java? [зачинено]


149

Як ми створюємо власні винятки на Java?


2
Це та сама методика, що використовується в більшості мов ОО: розширити базовий клас винятку.
NDM


1) // Клас, який представляє визначений для використання клас експепції MyException, розширює виняток {public MyException (String s) {super (s); }} ------------------------------------------------ 2) спробуйте {// Кинути об’єкт визначеного користувачем винятку, киньте нову MyException ("TestException"); } улов (MyException ex) {System.out.println ("Зловив"); // Роздрукувати повідомлення з об’єкта MyException System.out.println (ex.getMessage ()); }
Mandeep Yadav

Відповіді:


285

Щоб визначити перевірений виняток, ви створюєте підклас (або ієрархію підкласів) 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с.


25
public class MyException extends Exception {
        // special exception code goes here
}

Киньте це як:

 throw new MyException ("Something happened")

Ловити як:

catch (MyException e)
{
   // something
}

4

Для перевіреного винятку:

public class MyCustomException extends Exception { }

Технічно все, що розширюється, Throwableможе бути кинутим, але винятки - це, як правило, розширення Exceptionкласу, щоб вони перевіряли винятки (за винятком RuntimeException або класів, заснованих на ньому, які не перевіряються), на відміну від іншого поширеного типу переданих, Errors, які зазвичай не є чимось розробленим для того, щоб витончено обходитися поза внутрішніми можливостями JVM

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

Що стосується метання / вилучення спеціальних винятків, він працює так само, як і вбудовані - киньте через

throw new MyCustomException()

і зловити через

catch (MyCustomException e) { }

4
RuntimeException розширює виняток і не є перевіреним винятком.
Адамські

2
Технічно все, що розширюється, Throwableможе бути кинуто ; винятки поширюються Exception. Спеціальний підклас Throwable не буде схоплений try { ... } catch (Exception e) { ... }блоком.
Анджей Дойл

Чому люди підтримують цю відповідь? Він містить кілька неточностей. 1) Ви не можете імпортувати передачу, оскільки це інтерфейс. 2) Все, що розширює функцію Throwable, НЕ є винятком ( Errorце не виняток, це помилка). 3) Це означає, що будь-який підклас винятку перевіряється, тоді як RuntimeException - ні. Відповідь, яку дав Адамський, набагато точніша!
oxbow_lakes

На жаль, я мав на увазі, що передається - це не інтерфейс, звичайно!
oxbow_lakes

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