java exceptions exception handling with examples
Този видео урок за Java Exceptions обяснява всичко за обработката на изключения в Java. Ще научите за йерархията на изключенията, типовете, методите на класовете и още:
Когато изпълняваме Java програми, нормалното поведение или нормалният поток на програмата се прекъсва поради някои неочаквани събития.
Например, отваряме файл за четене на данните. Когато се изпълни извикването на отворен файл, ние откриваме, че файлът, който се опитваме да отворим, липсва. Това води до прекъсване на нормалния поток на програмата.
Това събитие, което засяга или прекъсва нормалния поток на програмата, се нарича „ Изключение ”.
=> Посетете тук, за да разгледате Java Training Series за всички.
Ето видео урок за работа с Java изключения:
какви програми могат да отворят dwg файл
Какво ще научите:
Обработка на изключения в Java
Когато възникне изключение в програмата, изпълнението на програмата се прекратява. Тъй като това е внезапно прекратяване, системата генерира съобщение и го показва. Съобщението, генерирано от системата, може да е загадъчно като някои кодове или нечетимо.
По този начин нормалният потребител трябва да разбере защо програмата спря внезапно изпълнението си, той / тя трябва да знае причината. Създадените от системата съобщения в резултат на изключение може да не са полезни. В Java можем да се справим с изключението и да предоставим смислени съобщения на потребителя за проблема.
Това обработване на изключение, известно като 'Обработка на изключения' е една от основните характеристики на програмирането на Java.
Причини за възникване на изключението
Можем да имаме различни причини, поради които могат да възникнат изключения. Ако това е изключение, свързано с въвеждане, тогава причината може да е, че входните данни са неправилни или нечетливи.
Ако получим изключение за входни / изходни файлове, тогава е напълно възможно файловете, с които имаме работа, да не съществуват. По друго време може да има грешки като мрежови проблеми, принтерът да не е наличен или да функционира и т.н.
В една програма, освен изключения, получаваме и грешки. По този начин, за да се справим ефективно с изключенията, трябва да сме наясно с разликите между грешка и изключение.
Грешка показва по-сериозен проблем с приложението и приложението не трябва да се опитва да го улови. Напротив, изключението е условие, което всяко разумно приложение ще се опита да хване.
По този начин грешката в приложението е по-сериозна и приложенията ще се сринат, когато срещнат грешка. Изключенията от друга страна се появяват в кода и могат да бъдат обработени от програмиста чрез предоставяне на коригиращи действия.
Какво представлява обработката на изключения?
Обработката на изключения в Java е механизъм, чрез който се поддържа нормалният поток на приложението. За целта използваме мощен механизъм за обработка на грешки или изключения по време на изпълнение в дадена програма.
Последователност от код, която се използва за обработка на изключението, се нарича „обработчик на изключения“. Манипулатор на изключения разпитва контекста в момента, когато е възникнало изключението. Това означава, че чете стойностите на променливите, които са били в обхвата, докато е възникнало изключението, и след това възстановява програмата Java, за да продължи с нормален поток.
Ползи от обработката на изключения
Основната полза от обработката на изключения е, че поддържа нормалния поток на приложението, въпреки появата на изключение. Когато възникне изключение, програмата обикновено се прекратява внезапно.
Наличието на манипулатор на изключения в програма няма да доведе до внезапно прекратяване на програмата. Вместо това манипулаторът на изключения гарантира, че всички изрази в програмата се изпълняват нормално и програмният поток не се прекъсва рязко.
Йерархия на изключенията в Java
Диаграмата по-долу показва йерархията на изключенията в Java. Класът java.lang.Throwable (низходящ от клас Object) е основният клас на Java Exception. Класовете Exception и Error са получени от този клас.
Класът на изключенията е базовият клас за всички останали изключения.
По-долу е дадена йерархия на клас Exception в Java, който ще изброи всички основни изключения, за които Java програмист трябва да знае.
Клас на изключение в Java
Както се вижда в йерархичната диаграма, клас Throwable има два директни подкласа, т.е. изключение и грешка. Изключенията, произтичащи от външен източник, са описани в класа Exception.
Класът на изключение декларира конструкторите като същите като клас Throwable и извикването на всеки конструктор също извиква неговия аналог Throwable. Класът на изключение не декларира своите методи, той наследява методите на клас Throwable.
Конструкторите и методите, които класът на изключение използва са представени по-долу.
Конструктори
Строител Описание публично изключение () Конструктор по подразбиране, който конструира ново изключение със съобщението като null. публично изключение (низово съобщение) Конструктор за конструиране на ново изключение с даденото съобщение. В този случай причината не е инициализирана и последващо извикване на Throwable.initCause (java.lang.Throwable) може да се използва за инициализиране на причината. публично изключение (съобщение на низ, причина за хвърляне) Изгражда ново изключение, използвайки дадено съобщение и причина. публично изключение (кауза за хвърляне) Конструира ново изключение с дадената причина и съобщение, дадено от (cause == null? Null: cause.toString ()) (което обикновено съдържа съобщението за класа и подробности за причината). защитено изключение (низово съобщение, кауза за изхвърляне, булево enableSuppression, булево writableStackTrace) Конструира ново изключение с дадено съобщение, причина, потискане (разрешено или деактивирано) и проследяващата стека проследяване (активирана или деактивирана).
Методи
Прототип на метода | Описание |
---|---|
публичен низ getMessage () | Получете подробно съобщение за възникналото изключение. |
публично хвърляне getCause () | Вземете причината за изключението, представено от хвърлящ се обект |
публичен String toString () | Обединява името на класа с резултата от getMessage () и връща резултантния низ. |
public void printStackTrace () | Отпечатва резултата от toString () и съдържанието на проследяването на стека в изходния поток за грешка, System.err. |
публичен StackTraceElement () getStackTrace () | Вземете всеки елемент в стека на стека под формата на масив. |
публично хвърляне fillInStackTrace () | Напълнете проследяването на стека с текущото проследяване на стека. |
Пример за изключение
След това представяме програма Java, за да демонстрираме основен пример за изключение. Тук предоставяме низ променлива, инициализирана до нулева стойност. Когато се опитваме да отпечатаме тази променлива, се извежда изключение, тъй като стойността String не може да бъде нула.
class Main { public static void main(String args()){ //declare a String variable and initialize it to null String myStr = null; //print the string System.out.println(myStr.length()); } }
Изход
Видове изключения в Java
Java поддържа три вида изключения:
- Проверено изключение
- Непроверено изключение
- Грешка
В този раздел ще обсъдим всички горепосочени три типа.
# 1) Проверено изключение
Някои изключения се проверяват по време на компилацията, когато кодът се компилира. Това са „Проверени изключения“. Програмата Java изхвърля грешка при компилация, когато установи, че кодът в програмата е склонен към грешки.
Можем да се погрижим за грешките при компилацията, хвърлени от проверено изключение, като обработваме изключенията, като заграждаме кода в блок try-catch или използваме ключовата дума throws
В йерархията на изключенията класът, директно наследяващ клас Throwable като IOException, ClassNotFoundException и др., Са всички проверени изключения с изключение на класовете RuntimeException и Error. Това са непроверени изключения.
Следващата програма на Java демонстрира проверени изключения, FileNotFoundException и IOException. В тази програма се опитваме да отворим несъществуващ файл и да четем от него.
Тъй като файлът не съществува, методът отворен файл хвърля FileNotFoundException. След това, когато се опитаме да прочетем съдържанието на файла и да го затворим, извикванията на методите хвърлят IOException.
import java.io.*; class Main { public static void main(String args()) { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
Изход
В горния изход, тъй като манипулаторът на изключения отсъства, получаваме грешки при компилация за проверени изключения.
Сега нека предоставим клауза за хвърляне за тази програма. Тъй като родителят на FileNotFoundException е IOException, ние просто ще посочим IOException след клаузата за хвърляне.
import java.io.*; class Main { public static void main(String args()) throws IOException { FileInputStream fis = null; //Open a file fis = new FileInputStream('C:/myfile.txt'); int k; //read contents of the file while(( k = fis.read() ) != -1) { System.out.print((char)k); } //close the file fis.close(); } }
Изход
Както се вижда от изхода, когато обработваме изключението, той осигурява по-смислен изход вместо грешките при компилацията.
# 2) Непроверено изключение
Непроверените изключения са изключенията, които се проверяват по време на изпълнение. Следователно, въпреки изключенията, компилирането на програми ще бъде успешно. Повечето непроверени изключения се изхвърлят поради лошите данни, използвани в програмата.
Класовете, които наследяват „RuntimeException“, са непроверени изключения. Изключения като ArrayIndexOutofBounds Exception, ArithmeticException, NullPOinterException и др. Са примери за непроверени изключения.
Следващата програма демонстрира непроверено изключение по време на изпълнение, причинено от разделяне на число на нула.
class Main { public static void main(String args()) { int num1=10; int num2=0; //divide both numbers and print the result int result=num1/num2; System.out.println(result); } }
Изход
Виждаме, че програмата се компилира успешно и след това ArithmeticException се хвърля по време на изпълнение.
Примери за непроверено изключение:
- ArrayIndexOutOfBoundsException
- NullPointerException
- IllegalArgumentException
- NumberFormatException
Освен горните две изключения, има още няколко проверени изключения, включително:
- SQLException
- InvocationTargetExecption
# 3) Грешка
Грешката обикновено е необратима и невъзстановима ситуация в дадена програма и когато възникне грешка, програмите се сриват. Някои от примерите за грешки в дадена програма са OutOfMemoryError, AssertionError и VirtualMachineError и др.
Класът за грешка се наследява от класа Throwable. Грешка описва ситуация, която не може да бъде обработена и води до срив на програма.
Нека обсъдим грешката OutOfMemory в този раздел като пример за грешка.
Знаем, че всички обекти в Java се разпределят с помощта на новия оператор и се съхраняват в купчината. Когато купчината остане без памет, Java Virtual Machine (JVM) не може да разпредели обекта. В същото време събирачът на боклук не може да освободи никаква памет. Тази ситуация води до грешка OutOfMemory.
OutOfMemoryError в Java ще изглежда както е показано по-долу:
'exception in thread 'main' java.lang.outofmemoryerror: java heap space'
Наличието на OutOfMemoryError в дадена програма означава, че или се обработват твърде много данни, или обектите се държат твърде дълго. Понякога това може да бъде и библиотека на трети страни, която използва памет.
Причини за OutOfMemoryError
# 1) Java Heap Space
Ако приложението има твърде много финализатори, тогава обектите на класа, които имат метода Finalize, не се възстановяват веднага от събирача на боклук, а се поставят в опашка за финализиране по-късно. Понякога финализирането не може да се справи с времето и паметта на купчината се запълва, което води до OutOfMemoryError.
Друга причина за OutOfMemoryError е, че посоченият размер на купчината може да е недостатъчен за приложението.
Следващият код демонстрира OutOfMemoryError, който може да възникне поради огромен размер на данните, деклариран за масив.
import java.util.*; public class Main { static List list = new ArrayList(); public static void main(String args()) throws Exception { Integer() array = new Integer(100000 * 100000); } }
Изход
# 2) Космос Пермген
Постоянната зона за генериране в паметта също може да бъде изчерпана и може да генерира грешка OutOfMemory.
Размерът на региона PermGen се определя по време на стартирането на JVM. Ако потребителят не зададе размера, тогава се използва размерът по подразбиране, който е специфичен за платформата.
Въпреки че горните две обикновено са основните причини за появата на OutOfMemoryError, може да има и други причини като размера на масива надвишаващ ограничението на VM и т.н.
Списък с изключения в Java
По-долу е даден списък на основните изключения, които се случват в Java. Предоставихме примери за програмиране за някои от тези изключения. Имайте предвид, че това са вградени изключения, поддържани от Java.
# 1) ArithmeticException: Аритметичните аномалии като разделяне на нула водят до ArithmeticException.
Програмата по-долу демонстрира появата на ArithmeticException.
class Main { public static void main(String args()) { try { //define two numbers int num1 = 100, num2 = 0; int result = num1 / num2; // divide by zero //print the result System.out.println('Result = ' + result); } catch (ArithmeticException e) { System.out.println('ArithmeticException:Division by Zero'); } } }
Изход
# 2) ArrayIndexOutOfBoundsException: ArrayIndexOutOfBoundsException се изхвърля при достъп до елемент на масив с помощта на нелегален индекс. Използваният индекс или надхвърля размера на масива, или е отрицателен.
# 3) ClassNotFoundException: Ако дефиницията на класа не е намерена, тогава се издига ClassNotFoundException.
# 4) FileNotFoundException: FileNotFoundException се дава, когато файлът не съществува или не се отваря.
# 5) IOException: IOException се изхвърля, когато операцията по въвеждане / извеждане се провали или бъде прекъсната.
# 6) InterruptException: Винаги, когато дадена нишка обработва или спи или чака, тя се прекъсва чрез хвърляне на InterruptedException.
# 7) NoSuchFieldException: Ако клас не съдържа посочено поле или променлива, той изхвърля NoSuchFieldException.
# 8) NoSuchMethodException: Когато методът, до който се осъществява достъп, не е намерен, тогава се извежда NoSuchMethodException.
# 9) NullPointerException: NullPointerException се издига, когато се отнася нулев обект. Това е най-важното и често срещано изключение в Java.
# 10) NumberFormatException: Това изключение се повдига, когато метод не може да преобразува низ в числов формат.
# 11) Изключение по време на изпълнение: Всяко изключение, което се случва по време на изпълнение, е RuntimeException.
# 12) StringIndexOutOfBoundsException: StringIndexOutOfBoundsException се изхвърля от клас String и показва, че индексът е извън размера на обекта String или е отрицателен.
# 13) EOFException: EOFException е част от пакета java.io и се изхвърля, когато се стигне до края на файла и файлът се чете.
# 14) IllegalArgumentException: IllegalArgumentException се изхвърля, когато на метода се предават незаконни или невалидни аргументи. Например, грешен формат на данните, нулева стойност, когато се изисква ненулева или аргументи извън обхвата.
Долната програма Java демонстрира IllegalArgumentException.
public class Main { int m; public static void setMarks(int marks) public static void main(String() args) { setMarks(45); setMarks(101); } }
Изход
В горната програма IllegalArgumentException се хвърля във второто извикване на функцията setMarks, където въвеждаме марки, които са извън обхвата (> 45).
# 15) InputMismatchException: InputMismatchException се изхвърля, когато четеният вход не съответства на посочен шаблон. Например, ако програмата очаква цяло число и чете float, тогава се вдига InputMismatchException.
# 16) NoSuchElementException: NoSuchElementException се изхвърля, когато следващият достъп до елемента не съществува.
Например, в Enumeration, методът nextElement () се използва за достъп до следващия елемент в изброяването. Ако елементът не съществува, тогава се хвърля NoSuchElementException. Предимно Java Collections хвърлят това изключение.
Дадената по-долу програма демонстрира това.
import java.util.*; public class Main { public static void main(String() args) { Set hash_Set = new HashSet(); //create an empty hashSet. //This throws NoSuchElementException since hashSet is empty hash_Set.iterator().next(); } }
Изход
най-добрите системни инструменти за Windows 10
# 17) ConcurrentModificationException: ConcurrentModificationException обикновено се изхвърля от класове Collection. Това изключение се изхвърля, когато обектите се опитват да модифицират ресурс едновременно.
Например, нишка не може да модифицира колекция, когато друга нишка има достъп до нея. Ако позволим две нишки, тогава тези две едновременно ще имат достъп до колекцията и ще има несъответствия.
Следващият пример демонстрира ConcurrentModificationException.
import java.awt.List; import java.util.*; public class Main { public static void main(String() args) { ArrayList A_list = new ArrayList<>(); //add elements to the ArrayList A_list.add(10); A_list.add(20); A_list.add(30); Iterator it = A_list.iterator(); while (it.hasNext()) { Integer value = it.next(); System.out.println('ArrayList Value:' + value); if (value.equals(30)) A_list.remove(value); } } }
Изход
В горната програма, докато се отпечатва ArrayList, ние се опитваме да изтрием елемент едновременно. Това е едновременният достъп и по този начин се създава изключение.
Персонализирани изключения в Java
Досега обсъдихме всички изключения, които са вградени или предоставени от езика Java. Освен тези изключения, можем да дефинираме и нашите собствени изключения. Те се наричат потребителски изключения или дефинирани от потребителя изключения.
Използвайки персонализирани изключения, ние можем да дефинираме нашите изключения според нашите нужди.
Следващият пример показва потребителското изключение, което дефинирахме за целочислена стойност.
//custom exception definition class InvalidValueException extends Exception{ InvalidValueException(String s){ super(s); } } class Main{ static void validate(int int_val)throws InvalidValueException{ if(int_val<10) //value is valid if> 10 else throw exception throw new InvalidValueException('Invalid value'); else System.out.println('This is valid integer'); } public static void main(String args()){ try{ validate(9); }catch(Exception m){System.out.println('Exception occured: '+m);} System.out.println('Code after Exception'); } }
Изход
често задавани въпроси
В # 1) Какво имате предвид под изключение?
Отговор: Събитие, което се случва по време на изпълнението на програма и нарушава нормалния поток на изпълнение на програмата, се нарича Изключение. Изключението е нежелано и неочаквано и може да възникне поради външни фактори или програмни грешки.
В # 2) Каква е разликата между грешка и изключение?
Отговор: Изключение правят събития, които нарушават нормалния поток на програмата. Можем да се справим с изключенията в нашата програма и да продължим с програмата нормално. Грешката е невъзстановимо събитие, което не може да бъде обработено и прекратява програмата.
В # 3) Какво имате предвид под обработка на изключения?
Отговор: Процесът на определяне на последователността от стъпки в програма за обработка на изключението се нарича обработка на изключения. Предоставяйки манипулатори на изключения в програма, можем да осигурим нормалния поток на програмата.
В # 4) Какви са предимствата на обработката на изключения в Java?
Отговор: Използвайки обработка на изключения, можем да поддържаме нормалния поток на изпълнение на приложение. Също така можем да разпространяваме грешките в стека на повикванията, когато предоставяме манипулатори на изключения.
Въпроси и отговори за интервюта на бизнес анализатор
Q # 5) Каква е ползата от обработката на изключения?
Отговор: Не прекратяването на нормалния поток на изпълнение на дадено приложение е основното използване на манипулатори на изключения в програма. Без манипулатори на изключения програмата ще се прекрати и нормалният поток на изпълнение ще бъде прекъснат, когато възникне изключение.
С изключение, правилно обработено в програмата, тя може да продължи с нормалното си изпълнение, дори когато възникне изключение.
Още примери за изключения
Изключение е събитие, което се случва, докато програмата се изпълнява и нарушава изпълнението на програмата. Поради което софтуерният продукт ще приключи внезапно.
Когато възникне това изключение, Java създава обект със съобщение за грешка и информация за класа. Това е обектът за изключение.
Защо се нуждаем от изключение в Java?
Class ExcepDemo без изключение:
public class ExcepDemo { public static void main(String() args) { int i=5; int j=0; System.out.println(i/j); System.out.println('statement after division'); } }
ИЗХОД:
Class ExcepDemo с обработка на изключения:
public class ExcepDemo { public static void main(String() args) { // TODO Auto-generated method stub int i=5; int j=0; try { System.out.println(i/j); } catch(ArithmeticException ae) { System.out.println('wrong input'); } System.out.println('statement after division'); } }
ИЗХОД:
Опитайте, хванете и накрая блокирайте:
- Изключение се обработва от try, catch block.
- Изявления, които могат да доведат до изключения, се записват в блока try.
- Когато възникне изключение, операторите вътре в блока catch ще бъдат изпълнени. Ако не възникне изключение, блокът catch не се изпълнява.
- Независимо от възникнало или не възникнало изключение, последният блок ще бъде изпълнен.
Видове изключения
Непроверено изключение:
Тъй като непроверените изключения могат да бъдат избегнати чрез правилното програмиране ( E.g. null pointer Exception, Arithmetic Exception) няма да е проверил от компилатора. Непроверено изключение ще бъде хвърлено по време на изпълнение.
Проверено изключение:
- Провереното изключение ще бъде проверено от компилатора и е задължително да се хвърли или обработи изключението.
- Това изключение се използва за отделяне на кода за обработка на грешки от обикновения код.
- Всички проверени изключения са групирани и е полезно при диференцирането на проблемите.
Пример: java.io
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; public class DemoExpChecked { public static void main(String() args) { try { File file=new File('input.txt'); BufferedReader br = new BufferedReader(new FileReader(file)) ; String content; while ((content=br.readLine())!=null) { System.out.println(content); } br.close(); } catch(IOException e) { e.printStackTrace(); } } }
Грешки
Грешка може да възникне поради логически грешки на програмата или друга памет, свързана с JVM проблем.
Пример: Грешка при свързване на паметта или грешка при препълване на стека.
Хвърляне и хвърляне
Ключовата дума Throw се използва за изхвърляне на изключението, докато ключовата дума „throws“ се използва за деклариране на изключението.
Хвърли примерна програма:
public class Demothrow { String content ; public void driving(String c) { this.content=c; if (content.isEmpty()) { throw new NullPointerException('content is empty'); } else { System.out.println('content=='+content); } } public static void main(String() args) { Demothrow dt=new Demothrow(); dt.driving(''); } }
Хвърля примерна програма:
Хвърлянията се използват за даване на информация, че този метод хвърля това специално изключение. Когато извиквате този конкретен метод, трябва да се справите с това изключение.
public class DemoThrows { int i=2,j=0; public void checkmethod () throws ArithmeticException{ System.out.println(i/j); } public static void main(String() args) { DemoThrows d =new DemoThrows(); try { d.checkmethod(); } catch (ArithmeticException ae) { ae.printStackTrace(); } } }
Основни моменти, които трябва да се отбележат:
- Изключения са необичайни събития, възникнали по време на изпълнението на програмата и това ще повлияе на потока на изпълнение.
- Грешката е различна от изключенията. Пример за грешки: Паметта е грешка.
- Проверените изключения се проверяват по време на компилацията и е задължително да се справите с това проверено изключение.
- По време на изпълнението възниква непроверено изключение.
Заключение
Този урок за обработка на изключения в Java въведе дефиницията за изключения, обработка на изключения и йерархията на изключенията в Java. Също така обсъдихме класа на изключенията в Java, който предоставя различни конструктори и методи за достъп до изключения.
Проучихме списък с често срещаните изключения, които се срещат в Java, и видяхме примерите за програмиране на основното изключение. Също така обсъдихме основните грешки, които се появяват в Java програма, заедно с видовете изключения и персонализирани изключения.
=> Проверете ВСИЧКИ уроци за Java тук.
Препоръчително четене
- Топ 10 изключения от селен и как да се справим с тях (точен код)
- Обработка на изключения JDBC - Как да се справя с SQL изключенията
- Как да се справя с изключенията в скриптове Groap на SoapUI - Урок № 11 за SoapUI
- Java String с String Buffer и String Builder Tutorial
- Разполагане на Java: Създаване и изпълнение на Java JAR файл
- Java нишки с методи и жизнен цикъл
- Java виртуална машина: Как JVM помага при стартирането на Java приложение
- Модификатори на достъп в Java - Урок с примери