Исключения

Download Report

Transcript Исключения

Основы программирования на
языке 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