Основы программирования на языке Java Обработка исключений (С) Всеволод Рылов, все права защищены Новосибирск, 2004 1 Ключевые слова – статус Ключевые слова, которые уже известны на текущий момент: abstractdefault do double else extends if implements import instanceof int private protected public return short this boolean throw break throws byte transient case try catch char class final finally float interface long native static strictfp super void volatile while const goto for package new synchronized switch continue Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 2 Класс java.lang.Object protected Object clone() используется для клонирования объектов. Для обеспечения клонирования класс должен перегрузить данный метод сделав его public и реализовав интерфейс Cloneable Class getClass() Возвращает объект типа Class содержащий информацию о классе объекта (о его методах, аттрибутах, пакете, правах доступа и т.д.) int hashCode() boolean equals() Возвращает значение hash функции от объекта. проверяет объекты на эквивалентность. Если вы перегружаете один из этих методов, то должны перегружать и другой. protected void finalize() Если вы перегрузили данный метод, то он будет вызван сборщиком мусора перед уничтожением объекта. wait(), notify(), notifyAll() Используются для синхронизации потоков при работе с объектами в многопоточном приложении String toString() Возвращает строковое представление объекта Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 3 Причины возникновения исключений Ошибочная ситуация синхронно обработанная JVM во время вычисления выражения: Выражение нарушает нормальную семантику языка (деление на ноль и т.д.) Ошибка во время загрузки или связывания части программы Нехватка ресурсов (недостаток памяти и др.) Эти исключения не вызываются в предопределенной точке программы. Вызов оператора throw Асинхронная ошибка, возникающая в следующих ситуациях: вызов метода stop() класса Thread внутренняя ошибка в виртуальной машине Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 4 Иерархия базовых исключений Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 5 Класс java.lang.Throwable Базовый класс для всех классов исключений и ошибок, объект которого содержит информацию о стеке исполнения потока Конструкторы: Создает новый объект на основе информации о стеке текущего потока Throwable() Throwable(String message) Создает новый объект на основе информации о стеке текущего потока плюс позволяет задать текст сообщения об ошибке Throwable(Throwable cause) Создает новый объект – обертку вокруг другого объекта Throwable. Стек вызовов заполняется на основе информации о стеке текущего потока Throwable(String message, Создает объект-обертку с возможностью переопределения сообщения Throwable cause) Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 6 Класс java.lang.Throwable (полезные методы) String getMessage() String getLocalizedMessage() Возвращает текст сообщения об ошибке printStackTrace() printStackTrace(PrintStream s) printStackTrace(PrintWriter s) Выводит информацию о стеке вызовов на момент возникновения ошибки. Распечатка ведется на стандартный поток ошибок или в указанный поток native Throwable fillInStackTrace() Заполняет информацию о стеке вызовов для текущего потока в объект Throwable и возвращает ссылку на этот-же объект. Используется конструкторами. initCause(Throwable cause) Throwable getCause() Манипуляция с объектом-источником (для оберток) StackTraceElement[ ] getStackTrace() setStackTrace(StackTraceElem ent[ ] stackTrace) Позволяет работать с элементами стека вызовов Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 7 Класс java.lang.StackTraceElement String getClassName() String getFileName() String getLineNumber() String getMethodName() Выдают информацию о точке вызова (исходный файл, строка в нем, имя класса, имя метода). Для того чтобы информация была доступна, код должен быть откомпилирован с включенной отладочной информацией int hashCode() boolean equals(Object obj) String toString() Перегруженные методы класса Object обеспечивающие сравнение двух объектов типа StackTraceElement, а также строковое представление boolean isNativeMethod() Возвращает true если вызван native метод Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 8 Error, Exception, RuntimeException java.lang.Error – ошибки работы виртуальной машины java. Выбрасываются самой виртуальной машиной и сигнализируют о серьезных проблемах. java.lang.Exception – базовый класс для исключений библиотеки и разрабатываемых приложений. Обычные исключения должны наследоваться от этого класса java.lang.RuntimeException – специальный класс исключений, наследников которого не обязательно перехватывать с помощью try-catch и декларировать в throws списке метода. Используется для исключений, которые сигнализируют об ошибках при написании программы Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 9 Runtime исключения синхронно вызываемые JVM при нарушении семантики языка при вычислении выражений OutOfMemoryError во время создания объекта (объекта – класса, массива, временного объекта при конкатенации строк) NegativeArraySizeException во время создания объекта – массива. NullPointerException во время использования (доступ к полю или вызов метода) ссылки или выражения результатом которого является ссылочный тип, имеющего значение null NullPointerException при обращении к элементу массива в случае если ссылка на массив содержит null ArrayIndexOutOfBoundsException в случае выхода за границы массива ClassCastException при попытке приведения несовместимых типов. Деление на ноль при выполнении операторов «/», «%» приводит к ArithmeticException ArrayStoreException при попытке присваивания элементу массива значения несовместимого ссылочного типа. Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 10 Обработка исключений Все исключения кроме наследников java.lang.Error и java.lang.RuntimeException должны явно обрабатываться одним из двух способов: Выражение которое может привести к возникновению исключительной ситуации должно быть помещено в try – catch блок, который перехватит данное исключение Метод содержащий выражение которое может привести к возникновению исключительной ситуации должен в объявлении throws содержать совместимый тип исключения (такой-же тип либо суперкласс данного исключения) Исключение прерывает нормальную последовательность исполнения выражений и приводит к передачи управления вверх по стеку вызовов методов вплоть до точки перехвата исключения Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 11 try – catch – finally TryStatement: try Block Catches try Block Catchesopt Finally Catches: CatchClause Catches CatchClause CatchClause: catch ( FormalParameter ) Block Finally: finally Block FormalParameter: finalopt Type VariableDeclaratorId VariableDeclaratorId: Identifier VariableDeclaratorId [ ] Новосибирск, 2004 try { … } catch (ChildException ce) { … } catch (ParentException pe) { … } catch (Exception ex) { … } catch (Throwable thr) { … } finally { … } (С) Всеволод Рылов, все права защищены 12 Обработка исключений try { ... throw new Exception (“Description”); ... } catch (Exception e) { System.err.println(“Exception caught:”+e); System.err.println(e.getMessage()); e.printStackTrace(); //На System.err e.printStackTrace(System.out);// PrintStream throw e; //Повторная генерация исключения } finally { //do something there System.out.println(“finally block”); } Новосибирск, 2004 (С) Всеволод Рылов, все права защищены 13 Пример обработки исключений class Test { public void doIt() throws Exception{ throw new Exception("doIt"); } public void doAnother() throws Exception { doIt(); } public void letsDoIt() throws Exception { try { doAnother(); } catch (Exception e) { System.out.println("first printStackTrace:"); e.printStackTrace(System.out); System.out.println("local context in catch:"); Throwable t = new Throwable(); t.fillInStackTrace(); t.printStackTrace(System.out); System.out.println("Throw it again..."); throw e; } } } Новосибирск, 2004 public class Main { public static void main(String[] args) { Test t = new Test(); try { t.letsDoIt(); } catch (Exception e) { System.out.println("Second printStackTrace:"); e.printStackTrace(System.out); } } } (С) Всеволод Рылов, все права защищены 14 Блок finally – отрабатывает всегда: public class FinallyDemo { static void procA() { try { System.out.println("procA"); throw new RuntimeException("Demo"); } finally { System.out.println("finally procA"); } } static void procB() { try { System.out.println("procB"); return; } finally { System.out.println("finally procB"); } } Новосибирск, 2004 static void procC() { try { System.out.println("procC"); } finally { System.out.println("finally procC"); } } public static void main(String[] args) { try { procA(); } catch (Exception ex) { System.out.println("Exception was caught"); ex.printStackTrace(System.out); } procB(); procC(); } } (С) Всеволод Рылов, все права защищены 15