ДЗ. Написать консольный калькулятор с использованием перехвата всех возможных исключений.




Введение в обработку исключений (Exception)

 

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

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

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

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

 

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

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

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

Например:

 

try{

int[] numbers = newint[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 (Exceptionex) будет обрабатывать практически все исключения.

Блоков 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. То есть с помощью этого оператора мы сами можем создать исключение и вызвать его в процессе выполнения.

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

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

doubleV,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 (NumberFormatExceptionexx){

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

}

catch (Exception ex){

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

}

Оператор throws

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

 

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

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

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

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

  publicstaticvoidmain(String[] args){   try{ intresult = getFactorial(-6);   System.out.println(result); } catch(Exception ex){   System.out.println(ex.getMessage()); } }

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

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

  publicstaticintgetFactorial(intnum){ 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()); } returnresult; }
   

 

ДЗ. Написать консольный калькулятор с использованием перехвата всех возможных исключений.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-10-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: