try catch finally
В този урок ще обсъдим различни ключови думи, използвани в Java за обработка на изключения, като например Опитай, Улови, Накрая, Хвърли и Хвърли с примери:
В предишните ни уроци видяхме основите на обработката на изключения в Java заедно с различните изключения, поддържани от класа Java Exception. Също така обсъдихме подробно NullPointerException.
Можем да включим изключения в нашата програма, като използваме определени ключови думи, предоставени в Java. Тези ключови думи дефинират различни блокове код, които улесняват дефинирането и обработката на изключения.
=> Посетете тук за ексклузивната серия уроци за обучение по Java.
Какво ще научите:
Опитайте, хванете, накрая в Java
Ключовите думи по-долу се използват в Java за обработка на изключения.
- Опитвам
- Хвани
- Накрая
- Хвърли
- Хвърля
Следващата таблица описва накратко тези ключови думи.
Ключова дума | Описание |
---|---|
Опитвам | Посочваме блока код, който може да доведе до изключение в специален блок с ключова дума „Опитайте“. |
Хвани | Когато се създаде изключение, то трябва да бъде уловено от програмата. Това се прави с помощта на ключова дума “catch”. Така блокът catch хваща блока try, който поражда изключение. Ключовата дума catch винаги трябва да се използва с опит. |
Накрая | Понякога имаме важен код в нашата програма, който трябва да бъде изпълнен, независимо дали изключението е хвърлено или не. Този код се поставя в специален блок, започвайки с ключовата дума „Накрая“. Блокът Final следва блока Try-catch. |
Хвърли | Ключовата дума “хвърляне” се използва за изрично изхвърляне на изключението. |
Хвърля | Ключовата дума “Хвърля” не създава изключение, но се използва за деклариране на изключения. Тази ключова дума се използва, за да покаже, че може да възникне изключение в програмата или метода. |
В този урок ще обсъдим подробно всички горепосочени ключови думи заедно с примерите за програмиране.
Опитайте да блокирате в Java
Винаги, когато пишем програма, може да има код, който подозираме, че може да създаде изключение. Например, може да подозираме, че в кода може да има операция „разделяне на нула“, която да създаде изключение.
Този код, който може да предизвика изключение, е затворен в блок с ключовата дума „try“. Така че блокът try съдържа кода или набор от изрази, които могат да предизвикат изключение.
Общият синтаксис на блока try е както следва:
try{ //set of statements that can raise exception }
Следователно, ако програмист смята, че определени изрази ще доведат до изключения, затворете тези изрази в блок за опитване. Имайте предвид, че когато възникне изключение при конкретен оператор в блок try, тогава останалата част от кода не се изпълнява.
Когато възникне изключение в блок за опити в даден оператор, контролата излиза и програмата внезапно се прекратява. За да предотвратим това рязко прекратяване на програмата, трябва да „обработим“ това изключение. Тази обработка се извършва с помощта на ключовата дума “catch”. Така че блокът try винаги има блок catch, който го следва.
Хвани блок в Java
Използваме catch блок за обработка на изключения. Това е блокът с ключовата дума “catch”. Блокът catch хваща блока try.
Винаги, когато възникне изключение в блока try, тогава се изпълнява кодът в блока catch, който съответства на изключението.
Общият синтаксис на блока catch е:
catch (Exception e){ //code to handle exception e }
По принцип декларираното изключение трябва да бъде родителският клас на всички изключения, т.е. Но ако има повече от едно изключение, можем също да напишем конкретни типове изключения или генерирани изключения.
След това ще обсъдим блока try-catch. Имайте предвид, че за всеки блок за опити можем да имаме множество блокове за хващане.
Опитайте да хванете Java
Общият синтаксис на блока try-catch е показан по-долу:
try{ //code causing exception } catch (exception (exception_type) e (object)) { //exception handling code }
Блокът try може да има множество редове код, които могат да предизвикат множество изключения. Всяко от тези изключения се обработва от независим блок за улов.
Общият манипулатор на изключения, обект e от клас Exception може да се справи с всички изключения, но ако искаме да се справим с конкретни изключения, препоръчително е да посочим общия манипулатор на изключения като последния блок за улавяне.
Пример за пробване на Java
Сега нека демонстрираме блок за опит за улавяне в Java. Тук в блока try дефинираме операция за разделяне. Делителят е нула. По този начин изявлението, което разделя двете числа, поражда аритметично изключение. Имаме блок за хващане, който дефинира манипулатор за аритметично изключение.
Дадено по-долу е примерна програма за Java.
class Main { public static void main(String args()) { int val1, val2; try { //this block will contain statements that may raise exceptions System.out.println('Try Block:: Start'); val1 = 0; val2 = 25 / val1; System.out.println(val2); System.out.println('Try Block:: End'); } catch (ArithmeticException e) { //handler for ArithmeticException System.out.println('ArithmeticException :: Divide by Zero!!'); } System.out.println('Outside try-catch:: Rest of the code.'); } }
Изход
как да направите масив от низове
Улавяне на множество изключения
Както вече споменахме, блокът try може да съдържа код, който поражда повече от едно изключение. В този случай ще ни трябват повече от един блок за хващане, за да се справим с всяко изключение. Един блок за опит може да бъде последван от множество блокове за хващане. Всеки блок за хващане ще обработва независимите изключения.
В случай на множество блокове за улов, трябва да запомним следните точки:
- Във всяка програма на Java по всяко време може да възникне само едно изключение. Също така, във всеки момент се изпълнява само един блок за хващане.
- Множествените блокове за улов трябва да бъдат подредени по такъв начин, че блокът за улов за най-специфичното изключение да е на първо място, а след това общото.
Например, ако имаме ArithmeticException и общо изключение, тогава обработването на блока за улов ArithmeticException ще дойде първо, последвано от обработката на изключението от блока за улов.
Примерът по-долу демонстрира множество блокове за улов.
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); myArray (5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
Изход
В горната програма се издига ArithmeticException, който е уловен в първия блок за хващане. Ако този блок за хващане не е бил посочен, тогава изключението би се разпространило до обобщения блок за хващане.
Нека леко модифицираме горната програма, така че блокът try да създаде две изключения. Сега нека видим резултата.
public class Main { public static void main(String() args) { //try block containing exception prone code try{ System.out.println('try Block:: Begin'); int myArray()=new int(5); System.out.println('Array element 10 : ' + myArray(10)); myArray(5)=10/0; } //multiple catch blocks catch(ArithmeticException e) { System.out.println('Arithmetic Exception :: Divide by zero!!'); } catch(ArrayIndexOutOfBoundsException e) { System.out.println('ArrayIndexOutOfBounds :: Accessed index out of bounds'); } catch(Exception e) { System.out.println('Exception :: ' + e.getMessage ()); } System.out.println('rest of the code'); } }
Изход
Ако видим този изход, той показва ArrayIndexOutOfBoundsException, който се хвърля. Това е така, защото операторът, който повдига ArrayIndexOutOfBoundsException, се изпълнява първо. Изключението се изхвърля и контролата отива към съответния блок за хващане.
Вложен опит за улавяне
Блок за опит в друг блок за опит се нарича вложен блок за опит. Имаме нужда от такива структури в определени ситуации, когато част от кода, съдържаща се в кода за опит, може да бъде такава, че някои редове да създават определени изключения, а друга част от кода да създава съвсем различно изключение.
В случай на вложени блокове за опит, първо се изпълнява най-вътрешният блок за опит и се обработва изключението. Ако най-вътрешният блок за опит няма съвпадащ блок за хващане, той се разпространява на едно ниво до своя родителски блок за опит. По този начин изключението се разпространява нагоре, докато се намери съвпадащ манипулатор на изключения.
Ако няма манипулатор на изключения, съответстващ на изключението, тогава програмата внезапно се прекратява със съобщение, генерирано от системата.
Общият синтаксис на вложен блок за опит е даден по-долу:
try { //try_block 1; try { //try_block 2; } catch(Exception e) { //exception handler code } } catch(Exception e) { //exception handler code }
Нека да приложим програма за демонстриране на вложен блок try-catch.
class Main{ public static void main(String args()){ //Main try block try{ //try block1 try{ System.out.println('Try Block1'); int num =15/0; System.out.println(num); } catch(ArithmeticException e1){ System.out.println('Block1 Exception: e1'); } //try block2 try{ System.out.println('Try Block2'); int num =100/0; System.out.println(num); } catch(ArrayIndexOutOfBoundsException e2){ System.out.println('Block2 Exception: e2'); } System.out.println('General statement after Block1 and Block2'); } catch(ArithmeticException e3){ System.out.println('Main Block Arithmetic Exception'); } catch(ArrayIndexOutOfBoundsException e4){ System.out.println('Main Block ArrayIndexOutOfBoundsException'); } catch(Exception e5){ System.out.println('Main Block General Exception'); } System.out.println('Code after Nested Try Block'); } }
Изход
В горната програма имаме два блока за опит, затворени в основния блок за опит. И двата вътрешни блока за опит имат код, който повишава ArithmeticException. Но ние предоставихме съвпадащ блок за хващане само за първия блок, а не за втория блок за опит.
Следователно вторият блок разпространява своето изключение до основния блок try и след това го обработва. Това е видно от резултата.
Накрая блокирайте в Java
Досега сме виждали блока try-catch и вложен try. Знаем, че кодът, който се очаква да предизвика изключението, е поставен в блок за опит. Когато възникне изключение, тогава останалата част от кода в блока try не се изпълнява.
Или програмата прекратява внезапно, ако не се обработва изключение, или контролата се предава на манипулатора на изключения.
В такава ситуация възниква необходимост от включване на код, който трябва да бъде изпълнен, независимо дали възниква изключение или не. Това означава, че ще изпълним парче код дори когато възникне изключение, а също и когато изключението не се случи.
Но тъй като try block излиза след повдигане на изключението, не можем да поставим този код в блока try. По същия начин, catch block има манипулатор на изключения, така че не можем да поставим и това в catch блока.
По този начин се нуждаем от отделен блок, който съдържа код, който се изпълнява, независимо дали възниква изключение или не. Java предоставя блок „окончателно“, който съдържа тази част от кода.
Следователно накрая блокът в Java може да съдържа критични изрази, които трябва да бъдат изпълнени в програмата. Изпълнението на тези изявления трябва да се извършва дори когато възникне изключение или не.
Следователно, ние ще поставим код като затваряне на връзки, поточни обекти и т.н. или който и да е код за почистване в окончателния блок, така че те да могат да бъдат изпълнени, дори ако възникне изключение.
Най-накрая блокът в Java обикновено се поставя след блока try or catch. Обърнете внимание, че блокът final не може да съществува без блок try. Когато окончателният блок е включен с try-catch, той се превръща в „ опитайте-хванете-накрая ”Блок.
Можем да пропуснем блока накрая в кода за обработка на изключения. Това означава, че накрая блокът е по избор.
Ако блокът try не предизвика никакво изключение, тогава блокът окончателно ще бъде изпълнен след блока try. Ако има изключение в блока try, контролът първо ще премине към блока catch и след това към блока final.
Изключение, възникващо в блок накрая, се държи по същия начин, както всяко друго изключение. Дори ако блокът try съдържа оператор return или разклонения като break и continue, тогава блокът final ще продължи да се изпълнява.
Имайки предвид тези точки, нека продължим с общия синтаксис и примери за окончателно блокиране.
Общият синтаксис на блока final е както следва:
try { //code that might raise exception }catch { //code that handles exception }finally { //mandatory code to be executed }
Въпреки че накрая блокът винаги се изпълнява, има определени ситуации или случаи, в които той не се изпълнява.
Това са следните случаи:
кой е най-добрият софтуер за поддръжка на компютър
- Когато нишката е мъртва.
- Когато се използва методът System.exit ().
- Когато възникне изключение в блока окончателно.
Нека да приложим няколко програми, за да демонстрираме окончателния блок.
class Main { public static void main (String args()) { //try block try { System.out.println ('::Try Block::'); int data = 125 / 5; System.out.println ('Result:' + data); } //catch block catch (NullPointerException e) { System.out.println ('::Catch Block::'); System.out.println (e); } //finally block finally { System.out.println (':: Finally Block::'); System.out.println ('No Exception::finally block executed'); } System.out.println ('rest of the code...'); } }
Изход
Горната програма показва блок try-catch-final. В блока try се изпълнява валидна операция и следователно не се прави изключение. Следователно контролата не се предава за улавяне от опит, а за окончателно блокиране.
Следващата програма е друг пример за блок try-catch-final, но в този случай изключението се хвърля в блока try, когато извършваме операция разделяне на нула. По този начин блокът окончателно се изпълнява след изпълнението на блока за улов.
class Main { public static void main(String args()) { //try block try{ System.out.println('::Try block::'); int num=67/0; System.out.println(num); } //catch block catch(ArithmeticException e){ System.out.println('::Catch block::'); System.out.println('ArithmeticException::Number divided by zero'); } //finally block finally{ System.out.println('::Finally block::'); } System.out.println('Rest of the code continues...'); } }
Изход
Хвърли изключение в Java
Java предоставя ключова дума „хвърляне“, с помощта на която можем изрично да изхвърлим изключенията в кода. Например, ако проверяваме аритметични операции и искаме да създадем някои изключения след проверка на операндите, можем да го направим с помощта на ключовата дума ‘throw’.
Използвайки ключовата дума throw, можем да хвърлим отметнатите или непроверени изключения. Ключовата дума throw се използва и за изхвърляне на персонализирани изключения.
Общият синтаксис на ключовата дума throw е:
throw exception; or throw new exception_class('error message');
Дадено по-долу е примерна програма за демонстриране на ключовата дума throw.
public class Main{ static void validate_Age(int age){ //if specified age is <18, throw ArithmeticException if(age<18) throw new ArithmeticException('Not eligible to vote and drive!!'); else //print the message System.out.println('Eligible to vote and drive!!'); } public static void main(String args()){ //call validate_Age method validate_Age(10); System.out.println('rest of the code...'); } }
Изход
В горната програма използваме метод за валидиране на възрастта. Ако възрастта е<18, then an exception is thrown to indicate the age is not valid.
Клауза за хвърляне
Видяхме блок за опити, за да декларираме изключения. Той съдържа кода, който може да предизвика изключения. Има и друг начин за деклариране на изключение и той използва ключовата дума “throws”.
Декларацията за изключение, използвайки ключовата дума “throws”, казва на програмиста, че може да има изключение, посочено след ключовата дума “throws” и програмистът трябва да предостави съответния код на манипулатора за това изключение, за да поддържа нормалния поток на програмата.
Възниква обаче въпросът защо ни е необходима ключова дума „хвърля“, когато имаме по-надежден блок за изпробване, за да декларираме и обработваме изключения?
Една от причините е, че броят на изключенията, които евентуално могат да възникнат, се увеличава, броят на catch блока, който обработва изключения, също се увеличава, тъй като един блок на catch може да се справи само с едно изключение.
По същия начин, ако в програмата има много методи и всеки метод има множество изключения, тогава кодът ще стане ненужно дълъг и неуправляем.
По този начин декларирането на изключение с хвърляне на ключова дума в сигнатурата на метода и след това обработка на извикването на метода с помощта на try-catch изглежда жизнеспособно решение.
Друго предимство на декларирането на изключения чрез ключова дума throws е, че сме принудени да се справим с изключенията. Ако не предоставим манипулатор за декларирано изключение, програмата ще изведе грешка.
Общият синтаксис на ключовата дума throws е както следва:
return_type method_name() throws exception_class_name{ //method code }
Нека сега приложим Java програма, за да демонстрираме ключовата дума „хвърля“.
В тази програма имаме клас Example_throw, в който имаме метод testMethod. В подписа на този testMethod декларираме две изключения IOException и Arithmetic Exception, използвайки ключовата дума throws. Тогава в основната функция, хвърлените изключения се обработват от блока catch.
import java.io.*; class Example_Throw { //declare exception using throws in the method signature void testMethod(int num) throws IOException, ArithmeticException{ if(num==1) throw new IOException('IOException Occurred'); else throw new ArithmeticException('ArithmeticException'); } }class Main{ public static void main(String args()){ try{ //this try block calls the above method so handle the exception Example_Throw obj=new Example_Throw(); obj.testMethod(1); }catch(Exception ex){ System.out.println(ex); } } }
Изход
често задавани въпроси
Въпрос # 1) Кога да използвам хвърляния хвърлям VS try-catch в Java?
Отговор: Ключовата дума “throws” се използва за деклариране на изключението с подпис на метода. Ключовата дума throw се използва за изрично изхвърляне на изключението. Блокът try-catch се използва за обработка на изключенията, хвърлени от други.
В # 2) Можем ли да използваме хвърляния, да опитаме и да хванем по един метод?
Отговор: Не. Не можете да хвърлите изключението и да го хванете по същия метод. Изключението, което е декларирано с използване на хвърляния, трябва да се обработва в извикващия метод, който извиква метода, който е хвърлил изключението.
В # 3) Какво се случва, когато блокът catch хвърля изключение?
Отговор: Когато в блока за хващане се хвърли изключение, програмата ще спре изпълнението. В случай че програмата трябва да продължи, тогава трябва да има отделен блок try-catch, за да се справи с изключението, повдигнато в блока catch.
В # 4) Какво е try-catch-final в Java?
Отговор: Блокът try-catch-final съдържа трите блока, т.е.блок try, catch блок и накрая блок.
Блокът за опити съдържа кода, който може да създаде изключение. Блокът Catch съдържа манипулатора на изключения за изключения в блока try. Блокът final съдържа критичния код, който ще се изпълни, независимо дали е възникнало изключението или не.
Въпрос # 5) Може ли най-накрая да блокираме try-catch?
Отговор: Да, ако имаме код за почистване, който може да хвърли изключение в блока окончателно, тогава можем да имаме блок за опит за улавяне. Изглежда обаче грозно.
Заключение
В този урок обсъдихме различните ключови думи, използвани при обработката на изключения в Java. Обсъдихме ключовите думи като try, catch, накрая хвърляне и хвърляне.
Кодът, който евентуално ще хвърли изключение, е затворен в блока try и catch осигурява манипулатора за изключението. Блокът накрая изпълнява затворения в него код, независимо дали изключението е хвърлено или не. Най-накрая блокът обикновено следва блока try или try-catch.
Използваме ключовата дума throws, за да декларираме изключения с подпис на метода и throw се използва изрично за хвърляне на изключения. Обикновено използваме ключова дума throw, за да изхвърляме персонализирани изключения.
=> Вижте Перфектното ръководство за обучение по Java тук.
Препоръчително четене
- Изключения на Java и обработка на изключения с примери
- Как да се справя с ArrayIndexOutOfBoundsException в Java?
- Урок за JAVA за начинаещи: 100+ практически ръководства за Java видео
- Обработка на изключения JDBC - Как да се справя с SQL изключенията
- C # Урок за обработка на изключения с примери за кодове
- Пълно ръководство за работа с SQL SQL изключения с примери
- Обработка на изключения в C ++
- Python Try Except - Python обработва изключение с примери