Исключения в Java
Исключения – это механизм взаимодействия между кодом, приведшим к ошибке, и кодом, обрабатывающим ошибку Исключение выбрасывается (throw), когда возникает некоторая ситуация. Оно перехватывается в программе (catch). В противном случае оно обрабатывается по умолчанию Throwable Error непроверяемые Exception RuntimeException непроверяемые Все прочие проверяемые Error – фатальные ошибки RuntimeExcaption – компилятор не требует их обязательной обработки Exception – компилятор проверяет предусмотрена ли обработка ошибок
Причины возникновения исключений Попытка выполнить некорректное выражение. Например, деление на ноль, или обращение к объекту по ссылке, равной null, попытка использовать класс, описание которого (class-файл) отсутствует, и т.д. В таких случаях всегда можно точно указать, в каком месте произошла ошибка, - именно в некорректном выражении. Выполнение оператора throw Этот оператор применяется для явного порождения ошибки. Здесь тоже можно указать место возникновения исключительной ситуации. Асинхронные ошибки во время исполнения программы. Все ошибки делятся на: синхронные – возможно найти точное место в коде, которое является причиной возникновения исключительной ситуации асинхронные - гораздо сложнее в обнаружении и исправлении. Обычному разработчику очень трудно выявить причины сбоев в виртуальной машине. Это могут быть ошибки создателей JVM, несовместимость с операционной системой, аппаратный сбой и т.д.
Обработка исключительных ситуаций Конструкция try-catch try { охраняемый блок } catch(SomeExceptionClass e) {...}... catch(AnotherExceptionClass e) {...} Конструкция try-catch-finally try { byte [] buffer = new byte[128]; FileInputStream fis = new FileInputStream("file.txt"); while(fis.read(buffer) > 0) {... обработка данных... } } catch(IOException es) {... обработка исключения... } finally { fis.flush(); fis.close(); }
Оператор 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
Перехват исключений class ExceptThrow { public static void main(String[] args) { int id = -1; try{ if (id
Переопределение методов и исключений При переопределении метода список исключений можно только сужать public class BaseClass{ public void method () throws IOException {... } } public class LegalOne extends BaseClass { public void method () throws IOException {... } } public class LegalTwo extends BaseClass { public void method () {... } } public class LegalTree extends BaseClass { public void method () throws IOException, MalformedURLException {... } } Ошибка!!! public class IllegalOne extends BaseClass { public void method () throws IOException,IllegalAccessException {... } } public class IllegalTwo extends BaseClass { public void method () {... throw new Exception(); } } Метод создает исключения, которые являются подклассами исключения, возбуждаемого в старом методе Исключение не указано