- •JAVA-ТЕХНОЛОГИЯ
- •Блоки и объявления локальных переменных
- •Условный оператор и условное выражение
- •Оператор switch
- •Операторы while и do-while
- •Операторы for, break, continue
- •Исключения (exceptions)
- •Исключения в Java
- •Рекомендации по проектированию исключений
- •Определение (классов) исключений
- •Неконтролируемые исключения
- •Обработка исключений: оператор try/catch/finally
- •Примеры использования исключений
- •Дополнительные возможности класса Exception
- •Assertions (предположения)
Неконтролируемые исключения
В принципе, не запрещается определять классы-потомки от
RuntimeException и Error
Они также могут содержать дополнительную информацию
Их не обязательно указывать в заголовке бросающего метода
Компилятор не контролирует их бросание и обработку (вне зависимости от того, указаны ли они в заголовке метода или нет)
Не рекомендуется определять и использовать расширения классов RuntimeException и Error; однако сами стандартные исключения использовать можно и даже рекомендуется:
if (p == null) throw new NullPointerException();
По семантике языка, потомок RuntimeException – это (стандартное) исключение, которое бросает Java Runtime (JVM); например, ClassCastException – неверное приведение класса
Потомок Error – это (стандартная) ошибка, например, OutOfMemoryError // используйте опцию, напр., java –mx128m C
(C) В.О. Сафонов. 2013
Обработка исключений: оператор try/catch/finally
public class TableUser {
public static void main(String[] args) { Table t = new Table(); …
try {
Object elem = t.getElement(”abc”); …
}catch (NoElementException e) { // обработка исключения System.out.println
(”Элемент с ключом ” + e.key + ” не найден”);
}catch (Throwable e) { // обработка остальных исключений System.out.println(“Неожиданное исключение:” + e);
}finally {
System.out.println(”Исполняется всегда”);
}// finally исполняется, даже если исключение не поймано
//(”последнее желание” == last resort )
}
(C) В.О. Сафонов. 2013
Примеры использования исключений
public class MyException extends Exception { … } public class MyError extends Error { … }
public class MyRuntimeException extends RuntimeException { … }
public class ExceptionUser {
public static void m1() { throw new MyException(); } // ошибка public static void m2() throws MyException
{throw new MyException(); } // все правильно public static void m3()
//throws MyRuntimeException – не обязательно
{throw new MyRuntimeException(); } // все правильно
//аналогично – для MyError
public static void main(String[] args) { m2(); // ошибка
try { m2(); } catch (MyException e) { System.out.println(”Gotcha!”)}
}}// ExceptionUser
(C)В.О. Сафонов. 2013
Дополнительные возможности класса Exception
public String toString() – выдает имя класса-исключения (по умолчанию), либо расширенный текст сообщения, если он был предусмотрен в конструкторе:
throw new MyException(”My exception occurred”);
public String getMessage() – выдает текст сообщения, соответствующего данному исключению
public void printStackTrace() – выдает в стандартный вывод трассировку стека при обработке исключения:
try { … } catch (MyException e) { e.printStackTrace(); } System.out.println(”OK”); // вывод:
MyException
at: ExceptionUser.m2 (ExceptionUser.java: 6) at: ExceptionUser.main (ExceptionUser.java: 10)
OK
Настоятельно рекомендуется при обработке исключения визуализировать для пользователей текст сообщения, содержащийся в объекте-исключении, например:
catch (Exception e) { System.err.println(“Exception” + e) }
(C) В.О. Сафонов. 2013
Assertions (предположения)
В Java впервые реализованы в JDK 1.4
Имеют вид:
assert B;
где B - логическое условие
Являются исполняемыми конструкциями: вычисляется условие; если оно ложно - AssertionError
Исторически появились в языках, начиная с 70-х годов. Например, широко используются в C++
Могут быть использованы для программирования на Java в стиле Design-by-Contract (Bertrand Meyer): с помощью assertions могут выражаться предусловия (require) и постусловия (ensure), например:
public static int GCD (int m, n) {
assert (m > 0 && n > 0); // precondition
(C) В.О. Сафонов. 2013
Q&A
Вопросы?
(C) В.О. Сафонов. 2013
