реклама

Изключение в програмирането означава изключително състояние в даден момент от изпълнението на програмата. Използва се, когато изключителното състояние може да се работи по-добре другаде, а не където се среща. Разгледайте следните примери:

  • Ако не се отвори конфигурационен файл, може да се обработва по-добре в кода, може би като се използва алтернативно местоположение на конфигурационния файл.
  • Достъп до елемент от масива Как да използвате Java ArrayListJava масивът е масив за преоразмеряване с общо предназначение. Той предоставя повечето от удобствата, които обикновено се очакват от масиви на други езици. В тази статия ще се научите да настройвате и използвате масив. Прочетете още извън границите на масива означава програмна грешка. Честито отстраняване на грешки!
  • Грешка при анализа на XML трябва да бъде изпратена до известието на потребителя, за да може XML файлът да бъде коригиран.
  • Програмата, която изчерпва паметта (може би при обработка на голям файл), може да се коригира, като може би се увеличи обемът на паметта, наличен за java процеса.
instagram viewer

Във всички тези случаи (и повече) изключението трябва да се обработва извън мястото, където то е генерирано, за да може да се реши основната причина.

Видове изключения

Изображението по-долу показва основните части на йерархията на изключенията на Java. Базовият клас е Може да се изхвърли която е подкласирана в изключение и грешка. клас изключение е за условия, свързани с програмата, които приложенията могат да уловят в опит да спасят ситуацията. клас грешка, от друга страна, е за посочване на сериозни грешки в средата на изпълнение на Java, които приложенията не трябва да хващат. Някои примери са: OutOfMemoryError и StackOverflowError.

Йерархия на изключенията

Една изключение отново е от два вида: проверен и непроверен. Проверено изключение трябва да се обработва от кода за повикване. Това правило се налага от компилатора на java. От друга страна, непроверено изключение може да бъде разпространено нагоре по веригата за повикване, без да е необходимо да го декларира изрично. Примерите по-долу ще изяснят.

Проверени изключения

Следният метод се опитва да създаде FileReader от файл. Конструкторът изхвърля проверено изключение FileNotFoundException които трябва да се обработват от извикващия код или декларирани за хвърляне.

Следният код ще не компилирайте, тъй като не прави нито едното, нито другото.

private void loadFile (Име на стринг файл) {FileReader in = нов FileReader (име на файл); }

Един от начините за получаване на кода за компилиране е обработката на изключението (вижте по-долу).

private void loadFile (Име на стринг файл) {опитайте {FileReader in = нов FileReader (име на файл)); {} улов (FileNotFoundException ex) {// обработка на изключение тук} }

Ако изключението не може да се обработва директно от обаждащия се, то трябва да бъде декларирано в подписа на метода.

private void loadFile (String filename) хвърля java.io. FileNotFoundException. {FileReader in = нов FileReader (име на файл)); { }

Непроверени изключения

Непроверено изключение е това, от което се подкласира RuntimeException и не е необходимо да се обработва директно или да се декларира по-горе. Например следният код води до a NullPointerException, което е вид RuntimeException. Кодът обаче се компилира без грешка, тъй като NullPointerException е непроверено изключение.

частен празен дръжкаEvent () {String name = null; if (name.length ()> 0) {} }

Изключения за опаковане

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

Следващият пример с кодове показа как да преодолеете изключение. Методът method_1 () хвърля SQLException в тялото му. За да се компилира правилно кодът, изключението трябва да бъде обявено за хвърляне.

private void method_1 () хвърля SQLException {... хвърли нова SQLException; }

Когато този метод се извиква от друг метод (method_2 ()), този метод може да хване SQLException и го увийте в непроверено изключение, така че не е необходимо да декларира изключението в подписа си на метод.

private void method_2 () {опитайте {method_1 (); } улов (java.sql. SQLException ex) {хвърлете нова RuntimeException (ex); } }

Изследване на стека на изключенията

Изследване на стека на изключения се отнася до масива от активни стекове на кадрите, всеки от които представлява метод на извикване, заснеман от JVM в момента, в който е изхвърлено изключението. Всеки стек кадър включва местоположението на извикването на метода, включително името на класа, името на метода и евентуално името на изходния файл на Java и номера на реда във файла. Полезно е за проследяване на последователността на обажданията това предизвика грешката Изключения на Java: Правилно ли се справяте с тях?Изключение в програмирането означава изключително условие в изпълнението на програмата. Използва се, когато състоянието може да се работи по-добре другаде. Разгледайте следните примери за обработка на изключения на Java. Прочетете още .

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

Изключение в нишката "main" java.lang. IndexOutOfBoundsException: Индекс: 8, Размер: 5 при java.util. ArrayList.rangeCheck (ArrayList.java: 653) в java.util. ArrayList.get (ArrayList.java: 429) в sample.sample1.main (sample1.java: 24)

Изключението, уловено тук, е IndexOutOfBoundsException. Тя включва допълнителна информация за грешката. Следата на стека съдържа 3 стека рамки, всеки от които включва информация за местоположението, както е показано.

Работа с изключения

Изключение може да се обработи, като го хванете в a опитай да хванеш блокирайте и предприемайте каквито и да е корективни действия. Най- изключение обект предоставя няколко метода за извличане на информация за състоянието, което го е причинило.

Следният код записва съобщението за грешка в лог файл.

private void loadConfig () {опита {// извикване на код, който може да генерира улов на IOException} (java.io. IOException ex) {// тук изключение се справя. Може да се регистрира в лог файл. log.warning (ex.getMessage ()); } }

Когато изключение е увито вътре в друго, можете да извлечете обвитото изключение:

Throwable reason = ex.getCause (); log.warning ("Основна причина:" + reason.getMessage ()); 

Трябва ли да получите достъп до следата на стека и може би да извлечете името на метода, който го е причинил?

StringBuilder sbuf = new StringBuilder ("Проследяване на стека:"); за (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). добавяне ("\ n"); } log.warning (sbuf.toString ());

Или може би, регистрирайте изключението и го прехвърлете отново?

опитвам {... } улов (java.io. IOException ех) {log.warning (ex.getMessage ()); хвърлям бивш; }

Най- изключение клас осигурява a printStackTrace () метод, който може да отпечата следата на стека по свой начин PrintStream (или PrintWriter).

опитвам {... } улов (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (излязъл); }

Можете да хванете няколко типа изключения в едно опитвам блокирайте и изпълнете специфична обработка за всеки тип изключение.

опитайте {// хвърля тук някои изключения. } улов (java.io. IOException ех) {// IOException специфична обработка тук. } улов (java.sql. SQLException ех) {// SQLException специфична обработка тук. }

За да уловите няколко типа изключения, но да използвате един и същ код за обработка, можете да декларирате a улов блок с няколко типа, както следва:

опитайте {// хвърля тук някои изключения. } улов (java.io. IOException | java.sql. SQLException ех) {// IOException и специфична обработка на SQLException тук. } улов (SAXException ex) {// SAXException специфична обработка тук. }

Почистване на ресурси с накрая

Когато се занимавате с код, който може да хвърля изключения, е изключително важно да извършите правилно почистване на всякакви ресурси, като отворени файлове Всичко, което трябва да знаете за форматите на файловете и техните свойстваНие използваме взаимозаменяемия файл с думи: музика, изображение, електронна таблица, слайдшоу и т.н. Но какво прави един файл "файл", така или иначе? Нека да опитаме и да разберем тази основна част от изчисленията. Прочетете още , връзки към база данни и т.н. Почистването на ресурсите трябва да се извърши в a накрая блок. По този начин както нормалният изход, така и изключителният изход от блок извикват код за почистване Десетте най-лоши грешки в програмирането в историятаВ своето историческо минало, кодиращо и ковано унищожение. Примери на малко лош код предизвика катастрофа на голямо ниво. Следват 10 от най-лошите програмни грешки в историята. Прочетете още .

InputStream in = null; опитвам {... in = нов FileInputStream (име на файл);... } улов (java.io. IOException ех) {log.warning (ex.getMessage ()); } накрая {// кодът тук се изпълнява при излизане от пробния блок, // дали нормално или поради изключение, ако (in! = null) in.close (); }

Опитайте с ресурс блок

Java 1.7 представи опитайте-с-ресурси конструкция, която улеснява почистването на ресурсите. Изглежда така:

опитайте (InputStream in = new FileInputStream (..)) {// код, който използва InputStream. }

Когато кодът излезе от блока (независимо дали чисто или поради изключение), InputStream променливата се почиства автоматично

Почистете множество ресурси, като декларирате всички в главата на блока.

опитайте (InputStream in = new FileInputStream (..); Връзка con =...; ) {// код, който използва InputStream и връзката. }

Всеки обект, чийто клас реализира AutoCloseable интерфейсът може да бъде почистен по този начин. Следващият клас извършва някои специфични почистване в близо() метод.

MyClass на публичен клас внедрява AutoCloseable {public void close () {// код за почистване тук} }

Използвайте инстанция от този клас в a опитайте-с-ресурси блок.

опитайте (MyClass obj = new MyClass (..)) {// код, който използва обекта MyClass. }

Някои често срещани изключения

Нека сега да разгледаме някои често срещани изключения.

  • IndexOutOfBoundsException (непроверено): показва, че индексът на достъп до елемент е извън границите на масив, низ и т.н.
  • SQLException (проверено): хвърлен поради грешка в базата данни.
  • IOException (проверено): грешка в достъпа до файл или грешки, свързани с въвеждането и изхода.
  • InterruptedException (проверено): хвърлено, когато изпълнението на нишката е прекъснато.
  • SAXException (отметнато): хвърлено поради грешки при анализа на XML
  • NullPointerException (непроверено): използване на null, когато се изисква обект.

Обобщавайки

Изключенията са основният метод за докладване и управление на грешки в Java. Правилно използване на изключения подобряване на качеството на кода Напишете или код по-бързо във вашия Linux редактор на текстове с персонализирани темиВашият текстов редактор на Linux не трябва да изглежда тънък и "функционален". Защо да не го настроите, за да подобрите производителността си, независимо дали скриптове и кодиране или използването на инструмента като редактор за маркиране? Прочетете още и помощ при решаване на проблеми в производството.

Имате ли свързани с изключения военни истории? Ако е така, кажете ни за това в секцията за коментари по-долу.

Кредитна снимка: Дмитрий Николаев чрез Shutterstock.com