Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 конспект лекций ООП Java.doc
Скачиваний:
28
Добавлен:
03.05.2015
Размер:
962.05 Кб
Скачать

Обработка исключительных ситуаций

Каждой исключительной ситуации поставлен в соответствие некоторый класс. Если подходящего класса не существует, то он может быть создан разработчиком. Исключения являются наследниками суперкласса Throwable и его подклассовErrorиExceptionиз пакетаjava.lang.

Особенностью исключений в Javaявляется то, что при возникновении исключительной ситуации всегда генерируется объект соответствующего типа, который должен быть перехвачен и обработан определенным для этого блоком кода. Кроме того, при создании метода можно сделать указание программисту включить в код обработку исключений, которые может генерировать этот метод.

Рис.1. Иерархия классов исключительных ситуаций

Обычно используется один из трех способов обработки исключений:

–  перехват и обработка исключения в блоках try-catch;

–  объявление исключений в секции throwsметода и передача  вызывающему методу;

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

Рассмотрим первый подход на следующем примере. При вводе/выводе  используется класс IOException. Например:

public void doRead(){

  try{

      System.in.read(buffer);

      }

  catch (IOException e) {

     String err = e.toString();

     System.out.println(err);

}

}

Исключение IOExceptionгенерируется методомread():

public int read() throws IOException

Метод doRread()в блокеtry вызывает метод read(), который пытается ввести данные из потокаSystem.inв буфер. Если возникает ошибка ввода, управление передается блокуcatch, в котором обрабатывается исключение, иначе блокcatchпропускается. Если блокtry-catchопустить, то компилятор укажет на ошибку.

Второй подход можно продемонстрировать на этом же примере.

Если метод может генерировать исключения, которые сам не обрабатывает, а передает для обработки другим методам, он должен объявить о таком поведении с помощью ключевого слова throws, чтобы вызывающие методы могли защитить себя от этих исключений. В вызывающих методах должна быть предусмотрена обработка этих исключений. Форма объявления такого метода:

тип имя_метода(список аргументов) throws список_исключений { }

При этом сам объявляемый метод может содержать блоки try-catch, а может и не содержать их. Например, методdoRead()можно объявить:

public void doRead() throws IOException{

System.in.read(buffer);

}

Обрабатывать исключение при этом будет метод, вызывающий doRead():

public void myDoRead(){

  try {

     doRead();

 }

catch (IOException e){

  String err = e.toString();

  System.out.println(err);

     }

}

Третий подход будет рассмотрен ниже на примере создания пользовательских исключений.

Метод может  обрабатывать несколько исключений.

/* пример # 1 : обработка 2-х типов исключений : TwoException.java */

class TwoException {

    public static void main(String[] args) {

 try {

    int a = (int)(Math.random() * 2);

    System.out.println("a = " + a);

        int c[] = { 1/a };

        c[1] = 1;

}

catch(ArithmeticException e){

     System.out.println("деление на 0"+ e);

}

catch(ArrayIndexOutOfBoundsException e) {

System.out.println("превышение границ массива: " + e);

}

      System.out.println("после блока try/catch");

     }

}

Исключение "деление на 0"возникнет при инициализации элемента массиваа = 0. В противном случае (а = 1) генерируется исключение"превышение границ массива"при попытке присвоить значение второму элементу массивас[], который содержит только один элемент.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]