Презентация "Исключения в Java"

Подписи к слайдам:
Исключения в 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<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!");}

}

Переопределение методов и исключений При переопределении метода список исключений можно только сужать 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(); }

}

Метод создает исключения, которые являются подклассами исключения, возбуждаемого в старом методе

Исключение не указано