Исключения – это механизм взаимодействия между кодом, приведшим к ошибке, и кодом, обрабатывающим ошибку
Исключение выбрасывается (throw), когда возникает некоторая ситуация.
Оно перехватывается в программе (catch). В противном случае оно обрабатывается по умолчанию
Error – фатальные ошибки |
Причины возникновения исключений
Попытка выполнить некорректное выражение. Например, деление на ноль, или обращение к объекту по ссылке, равной null, попытка использовать класс, описание которого (class-файл) отсутствует, и т.д. В таких случаях всегда можно точно указать, в каком месте произошла ошибка, - именно в некорректном выражении.
Выполнение оператора throw Этот оператор применяется для явного порождения ошибки. Здесь тоже можно указать место возникновения исключительной ситуации.
Асинхронные ошибки во время исполнения программы.
Все ошибки делятся на:
синхронные – возможно найти точное место в коде, которое является причиной возникновения исключительной ситуации
асинхронные - гораздо сложнее в обнаружении и исправлении. Обычному разработчику очень трудно выявить причины сбоев в виртуальной машине. Это могут быть ошибки создателей JVM, несовместимость с операционной системой, аппаратный сбой и т.д.
Обработка исключительных ситуаций
Конструкция try-catch
Оператор throw
Программист сам может явно породить исключительную ситуацию
...
public int calculate(int theValue) throws Exception { I
f( theValue < 0) {
throw new Exception("Параметр для вычисления не должен быть отрицательным");
}}...
Можно передать информацию об исключительной ситуации в вызывающий код
...
try { ...
} catch(IOException ex) {
... // Обработка исключительной ситуации
... // Повторное возбуждение исключительной ситуации
throw ex;
}
Преимущества исключений
Разделение кода и обработки ошибок
Группирование ошибок по типам
Раскрутка стека
readFile {
try {
open the file;
determine its size;
allocate that much memory;
read the file into memory;
close the file;
} catch (fileOpenFailed) {
doSomething;
} catch (sizeDeterminationFailed) {
doSomething;
} catch (memoryAllocationFailed) {
doSomething;
} catch (readFailed) {
doSomething;
} catch (fileCloseFailed) {
doSomething;
}
}
method1 {
try {
call method2;
} catch (exception) {
doErrorProcessing;
}
}
method2 throws exception {
call method3;
}
method3 throws exception {
call readFile;
}
Создание классов исключений
public class UserException extends Exception {
public UserException() {
super();
}
public UserException(String descry) {
super(descry);
}
}
Выбрасывание исключения:
throw new UserException( "Дополнительное описание");
Выбрасывание исключений
class ExceptThrow
{
public static void main(String[] args)throws MyException
{int id = -1;
if (id<1)throw new MyException();
System.out.println("Никогда не выполнится");
}
}
class MyException extends Exception
{
MyException(){System.out.println("Id must be natural!");}
}
Перехват исключений
class ExceptThrow
{
public static void main(String[] args)
{
int id = -1;
try {
if (id<1)throw new MyException();
} catch(MyException e){
System.out.println("Mistake");
} finally {
System.out.println("Id="+id);
}
System.out.println("Finished");
}
}
class MyException extends Exception
{
MyException(){System.out.println("Id must be natural!");}
}
Переопределение методов и исключений
При переопределении метода список
исключений можно только сужать
Ошибка!!! |
Метод создает исключения, которые являются подклассами исключения, возбуждаемого в старом методе |
Исключение не указано |
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.