Рекламное объявление

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

  • Неспособность открыть файл конфигурации может быть лучше обработана выше в коде, возможно, с использованием альтернативного расположения файла конфигурации.
  • Доступ к элемент массива Как использовать Java ArrayListМассив Java - это универсальный изменяемый размер массива. Он предоставляет большинство возможностей, обычно ожидаемых от массивов на других языках. В этой статье вы научитесь настраивать и использовать arraylist. Подробнее за пределами массива означает программную ошибку. Удачной отладки!
  • Ошибка синтаксического анализа XML должна быть доведена до сведения пользователя, чтобы файл XML можно было исправить.
  • Программе не хватает памяти (возможно, при обработке большого файла) можно исправить, возможно, увеличив объем памяти, доступный для процесса Java.
instagram viewer

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

Типы исключений

На рисунке ниже показаны основные части иерархии исключений Java. Базовый класс Throwable который подклассифицируется в исключение и ошибка. Учебный класс исключение для программных условий, которые приложения могут поймать при попытке спасти ситуацию. Учебный класс ошибкас другой стороны, для указания серьезных ошибок в среде выполнения Java, которые приложения не должны отлавливать. Вот некоторые примеры: OutOfMemoryError и StackOverflowError.

Иерархия исключений

исключение снова имеет два типа: проверено и не проверено. Проверенное исключение должно быть обработано вызывающим кодом. Это правило применяется Java-компилятором. С другой стороны, непроверенное исключение может распространяться вверх по цепочке вызовов без явного объявления этого. Приведенные ниже примеры пояснят.

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

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

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

private void loadFile (имя строки) {FileReader in = новый FileReader (имя файла); }

Один из способов получить код для компиляции - обработать исключение (см. Ниже).

private void loadFile (имя строки) {try {FileReader in = new FileReader (имя файла)); {} catch (FileNotFoundException ex) {// обработать исключение здесь} }

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

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

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

Непроверенное исключение - это исключение из подкласса RuntimeException и не должны быть обработаны напрямую или объявлены как указано выше. Например, следующий код приводит к Исключение нулевого указателя, который является типом RuntimeException. Код, однако, компилируется без ошибок, так как Исключение нулевого указателя это непроверенное исключение.

приватный void handleEvent () {String name = null; if (name.length ()> 0) {} }

Обтекание Исключений

Учитывая приведенное выше обсуждение проверенных и непроверенных исключений, кажется, что легче справиться с непроверенными исключениями, поскольку вам не нужно объявлять их или обрабатывать их самостоятельно. Учитывая это удобство, иногда бывает полезно заключить проверенное исключение в непроверенное исключение.

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

private void method_1 () выдает SQLException {... бросить новое SQLException; }

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

private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {throw new RuntimeException (ex); } }

Трассировка стека исключений

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

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

Исключение в теме "основной" 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 кадра стека, каждый из которых включает в себя информацию о местоположении, как показано.

Обработка исключений

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

Следующий код записывает сообщение об ошибке в файл журнала.

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

Когда исключение заключено в другое, вы можете получить упакованное исключение:

Выбрасываемая причина = ex.getCause (); log.warning («Основная причина:» + причина.getMessage ()); 

Вам нужно получить доступ к трассировке стека и, возможно, извлечь имя метода, вызвавшего его?

StringBuilder sbuf = new StringBuilder ("Отслеживание стека:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());

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

пытаться {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); бросить экс; }

исключение класс обеспечивает printStackTrace () метод, который может напечатать трассировку стека к вашему собственному PrintStream (или же PrintWriter).

пытаться {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }

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

try {// выбрасывает некоторые исключения здесь. } catch (java.io. IOException ex) {// IOException для конкретной обработки здесь. } catch (java.sql. SQLException ex) {// SQLException специфическая обработка здесь. }

Чтобы перехватить несколько типов исключений, но использовать один и тот же код обработки, вы можете объявить улов блок с несколькими типами следующим образом:

try {// выбрасывает некоторые исключения здесь. } catch (java.io. IOException | java.sql. SQLException ex) {// IOException и SQLException специфичная обработка здесь. } catch (SAXException ex) {// специфическая обработка SAXException здесь. }

Очистка ресурсов с наконец

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

InputStream in = null; пытаться {... in = new FileInputStream (filename);... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } finally {// здесь выполняется код при выходе из блока try, // как обычно, так и из-за исключения if (in! = null) in.close (); }

Блок "Попробуйте с ресурсами"

Java 1.7 представила примерочных с-ресурсы конструкция, которая облегчает очистку ресурса. Это выглядит так:

try (InputStream in = new FileInputStream (..)) {// код, который использует InputStream. }

Когда код выходит из блока (чисто или из-за исключения), InputStream Переменная автоматически очищается.

Очистите несколько ресурсов, объявив все из них в заголовке блока.

try (InputStream in = new FileInputStream (..); Соединение con =...; ) {// код, который использует InputStream и Connection. }

Любой объект, чей класс реализует AutoCloseable интерфейс может быть очищен таким образом. Следующий класс выполняет определенную очистку в близко() метод.

открытый класс MyClass реализует AutoCloseable {public void close () {// код очистки здесь} }

Используйте экземпляр этого класса в примерочных с-ресурсы блок.

try (MyClass obj = new MyClass (..)) {// код, который использует объект MyClass. }

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

Давайте теперь посмотрим на некоторые часто встречающиеся исключения.

  • IndexOutOfBoundsException (не отмечено): указывает, что индекс элемента, к которому осуществляется доступ, находится за пределами массива, строки и т. д.
  • SQLException (проверено): выброшено из-за ошибки базы данных.
  • IOException (проверено): ошибка доступа к файлу или ошибки, связанные с вводом и выводом.
  • InterruptedException (проверено): генерируется, когда выполнение потока прерывается.
  • SAXException (проверено): выбрасывается из-за ошибок синтаксического анализа XML.
  • Исключение нулевого указателя (не проверено): использование нуля там, где требуется объект.

Завершение

Исключения являются основным методом сообщения об ошибках и управления ими в Java. Правильное использование исключений повысить качество кода Написать или код быстрее в вашем текстовом редакторе Linux с пользовательскими темамиВаш текстовый редактор Linux не должен выглядеть мрачным и «функциональным». Почему бы не настроить его для повышения производительности, будь то сценарии и кодирование или использование инструмента в качестве редактора разметки? Подробнее и помощь в решении вопросов на производстве.

У вас есть какие-либо связанные с исключениями военные истории? Если это так, сообщите нам об этом в разделе комментариев ниже.

Имиджевый кредит: Дмитрий Николаев через Shutterstock.com