Введение в обработку исключений (Exception)
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

Нередко в процессе выполнения программы могут возникать ошибки, при том необязательно по вине разработчика. Некоторые из них трудно предусмотреть или предвидеть, а иногда и вовсе невозможно. Так, например, может неожиданно оборваться сетевое подключение при передаче файла, можем выйти за пределы массива, происходит деление на 0, обращаемся к несуществующему файлу при записи или считывании информации. Подобные ситуации называются исключениями.

Так как Java - это объектно-ориентированный язык программирования, то каждый Exception это Класс. И эти классы унаследуют друг друга, раcширяя их возможности и делая их более уникальными для каждого вида ошибок.

§ CHECKED Ошибки - те, для которых мы обязательно должны прописать какое-то решение, если что-то пойдет не так.

§ UNCHECKED Ошибки - те, которые мы не можем предвидеть заранее.

 

В языке Java предусмотрены специальные средства для обработки подобных ситуаций. Одним из таких средств является конструкция try...catch...finally (пытаться ... поймать ... под конец).

§ В блоке try Вы пишите код, который может в какой-то момент сработать не правильно и создать ошибку.

§ В блоке catch Вы ловите эту ошибку, указав какой класс Ошибки будете ловить, после чего описываете как ее обработаете. Если такого блока не найдено, то пользователю отображается сообщение о необработанном исключении, а дальнейшее выполнение программы останавливается.

Например:

 

try{

int[] numbers = new int[3];

numbers[4]=45;

System.out.println(numbers[4]);

}

catch(Exception ex){

System.out.println("Вышли за пределы массива");

}

System.out.println("Программа завершена!");

 

Выражение catch имеет следующий синтаксис:

catch (тип_исключения имя_переменной).

В данном случае объявляется переменная ex, которая имеет тип Exception. Но если возникшее исключение не является исключением типа, указанного в инструкции сatch, то оно не обрабатывается, а программа просто зависает или выбрасывает сообщение об ошибке.

Но так как тип Exception является базовым классом для многих исключений, то выражение catch (Exception ex) будет обрабатывать практически все исключения.

Блоков catch может быть несколько. После завершения выполнения блока catch программа продолжает свою работу, выполняя все остальные инструкции после блока catch.

Пример:

int[] numbers = new int[3];

try{

numbers[6]=45;

numbers[6]=Integer.parseInt("gfd");

}

catch(ArrayIndexOutOfBoundsException ex){

 

System.out.println("Выход за пределы массива");

}

catch(NumberFormatException ex){

System.out.println("Ошибка преобразования из строки в число");

}

Если у нас возникает исключение определенного типа, то оно переходит к соответствующему блоку catch.

Конструкция try..catch также может иметь блок finally. Однако этот блок необязательный, и его можно при обработке исключений опускать. Блок finally выполняется в любом случае, возникло ли исключение в блоке try или нет.

Оператор throw (бросать)

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

Расчёт скорости по вводимым расстоянию и времени

String S,T;//расстояние, время (в строках)

double V,s,t;//скорость, расстояние , время(в числах)

                           

try {

    Scanner in=new Scanner(System.in);

    System.out.print("Введите S=");

    S=in.nextLine();

    s = Double.parseDouble(S);

                                     

    System.out.print("Введите t=");

    T=in.nextLine();

    t= Double.parseDouble(T);

                                                                          

    if (t<=0 || s<0) throw new Exception("Введите корректные значения");

    V=s/t;

    System.out.printf("Скорость: %5.3f",V);

}

catch (NumberFormatException exx){

    System.out.println("введены символы!");

}

catch (Exception ex){

     System.out.println(ex.getMessage());

}

Оператор throws

(переброс обработки исключения в точку вызова метода)

 

Иногда метод, в котором может генерироваться исключение, сам не обрабатывает это исключение. В этом случае в объявлении метода используется оператор throws, который надо обработать при вызове этого метода. Например, у нас имеется метод вычисления факториала, и нам надо обработать ситуацию, если в метод передается число меньше 0:

  public static int getFactorial(int num) throws Exception{   if(num<0) throw new Exception("Число не может быть меньше 0"); if (num ==0) return 1; else return getFactorial(num-1)*num; }
   

 

С помощью оператора throw по условию выбрасывается исключение. В то же время метод сам это исключение не обрабатывает с помощью try..catch, поэтому в определении метода используется выражение throws Exception.

Теперь при вызове этого метода нам обязательно надо обработать выбрасываемое исключение:

  public static void main(String[] args){   try{ int result = getFactorial(-6);   System.out.println(result); } catch(Exception ex){   System.out.println(ex.getMessage()); } }

Без обработки исключения у нас возникнет ошибка компиляции, и мы не сможем скомпилировать программу.

В качестве альтернативы мы могли бы и не использовать оператор throws, а обработать исключение прямо в методе:

  public static int getFactorial(int num){ int result = 1;         try     {     if(num<0) throw new Exception("Число не может быть меньше 0");               if (num ==0) return result;               else result = getFactorial(num-1)*num;     }     catch (Exception ex)     {        System.out.println(ex.getMessage());     }     return result; }
   

 



Дата: 2018-11-18, просмотров: 464.