Kwert-soft.ru

IT Софт для ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java io ioexception что это

Исключения в Java

категория
Java
дата04.05.2014
авторvovanok
голосов85

Исключение — это проблема(ошибка) возникающая во время выполнения программы. Исключения могут возникать во многих случаях, например:

  1. Пользователь ввел некорректные данные.
  2. Файл, к которому обращается программа, не найден.
  3. Сетевое соединение с сервером было утеряно во время передачи данных.

И т.п.

Обработка исключительных ситуаций (exception handling) — механизм языков программирования, предназначенный для описания реакции программы на ошибки времени выполнения и другие возможные проблемы (исключения), которые могут возникнуть при выполнении программы и приводят к невозможности (бессмысленности) дальнейшей отработки программой её базового алгоритма.

Синтаксис

  1. try — данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.
  2. catch — ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений.
  3. finally — ключевое слово для отметки начала блока кода, которое является дополнительным. Этот блок помещается после последнего блока ‘catch’. Управление обычно передаётся в блок ‘finally’ в любом случае.
  4. throw — служит для генерации исключений.
  5. throws — ключевое слово, которое прописывается в сигнатуре метода, и обозначающее что метод потенциально может выбросить исключение с указанным типом.

Здесь в методе getAreaValue мы бросаем исключение IllegalArgumentException с помощью ключевого слова throw. В данном случае в сигнатуре метода отсутствует throws IllegalArgumentException, это не сделано потому что исключение IllegalArgumentException является не проверяемым, о них мы ещё поговорим.

Общий вид конструкции для «поимки» исключительной ситуации выглядит следующим образом:

В нашем случае для площади прямоугольника:

Здесь мы поймали IllegalArgumentException и залогировали данное событие. Дело в том что «починить» такую поломку мы не можем, не будем же мы угадывать что хотел пользователь :). По этому мы пробрасываем данное исключение дальше с помощью «throw e;». Такое часто можно встретить на серверах приложений(веб-серверах).

finally

Иногда требуется гарантировать, что определенный участок кода будет выполняться независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода используется ключевое слово finally. Даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try. У каждого раздела try должен быть по крайней мере или один раздел catch или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для временного использования в начале выполнения метода. Ниже приведен пример класса с двумя методами, завершение которых происходит по разным причинам, но в обоих перед выходом выполняется код раздела finally.

В этом примере в методе procA из-за возбуждения исключения происходит преждевременный выход из блока try, но по пути «наружу» выполняется раздел finally. Другой метод procB завершает работу выполнением стоящего в try-блоке оператора return, но и при этом перед выходом из метода выполняется программный код блока finally. Ниже приведен результат, полученный при выполнении этой программы.

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

Все классы обрабатывающие ошибки являются наследниками класса java.lang.Throwable. Только объекты этого класса или его наследников могут быть «брошены» JVM при возникновении какой-нибудь исключительной ситуации, а также только эти объекты могут быть «брошены» во время выполнения программы с помощью ключевого слова throw.

Прямыми наследниками класса Throwable являются Error и Exception.

Error — это подкласс, который показывает серьезные проблемы возникающие во время выполнения приложения. Большинство из этих ошибок сигнализируют о ненормальном ходе выполнения программы, т.е. о каких-то критических проблемах. Эти ошибки не рекомендуется отмечать в методах посредством throws-объявления, поэтому они также очень часто называются не проверяемые (unchecked).
Источник

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

Рассмотрим основные классы исключений.

IndexOutOfBoundsException — выбрасывается, когда индекс некоторого элемента в структуре данных(массив/коллекция) не попадает в диапазон имеющихся индексов.

Создание своих классов исключений

Хотя встроенные исключения Java обрабатывают большинство частых ошибок, вероятно, вам потребуется создать ваши собственные типы исключений для обработки ситуаций, специфичных для ваших приложений. Это достаточно просто сделать: просто определите подкласс Exception (который, разумеется, является подклассом Throwable). Ваши подклассы не обязаны реализовывать что-либо — важно само их присутствие в системе типов, которое позволит использовать их как исключения.

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

Одному блоку try может соответствовать сразу несколько блоков catch с разными классами исключений.

Это удобно, если обработка ошибок не отличается.

Конструкция try-with-resources

Наследование методов бросающих исключения

Можно лишь сужать класс исключения:

Как бросить проверяемое исключение не обрабатывая его (хак)

Нет ничего невозможного. С помощью рефлексии и внутреннего API языка java можно творить магию :).

Естественно так писать нельзя , но знать как это делается все же интересно.

Читать еще:  Java android intent

sun.misc.Unsafe — API позволяющее выполнять с классами, методами и полями действия, недопустимые стандартными средствами языка. Идея заключается в получении системного объекта Unsafe.

В примере используется рефлексия для получения объекта Unsafe так как другими средствами это сделать проблематично. У класса Unsafe приватный конструктор. А если попытаться вызвать статический метод getUnsafe() то будет брошено исключение SecurityException.

Заключение

Изначально я хотел сделать себе шпаргалку по иерархии классов исключений и не планировал писать статью. Но получилось так, что шпаргалка выросла в статью 🙂

Надеюсь она поможет кому-нибудь перед собеседованием, или просто вспомнить/углубить знания 🙂 Спасибо за внимание!

Если Вам понравилась статья, проголосуйте за нее

Голосов: 85 Голосовать

Является ли throws IOException избыточным в коде?

17.09.2018, 10:42

Ошибка в throws IOException
В чём заключается причина ошибки, в следующем коде. import java.io.*; public class Main <.

Что делать с избыточным текстом?
как мне быть с избыточным текстом в ячейках и уж тем более в div’ах? Если задаёшь div’у ширину, то.

Записать в первый файл учеников с ростом от 175 см, в другой — с избыточным весом
Прога должна создавать файл, поместив в него данные о 100 учениках (фамилия, рост, вес) и записать.

Throws
Здравствуйте! Собственно, вопрос нубский, но сам что-то не особо разобрался. Что делает этот код.

17.09.2018, 10:59217.09.2018, 11:08 [ТС]317.09.2018, 11:13417.09.2018, 11:145

Решение

17.09.2018, 17:35 [ТС]6

Welemir1, Наконец то разобрался с пробросом исключения метода, в сигнатуру списка throws, метода, из блока которого, данный метод вызывается. Спасибо.

Бро Авизу, спасибо за внимание, жаль, что его представления обо мне, не соответствуют действительности.

А вот, навскидку и для истории в т.ч., линк с (имхо) отличным изложением по теме сабжа:
j a v a r u s h . ru/groups/posts/1897-iskljuchenija-v-java

А вот, навскидку, для бро Авиза, мой конспект по иерархии исключений:

Типы исключений в Java:
Checked — проверяемые — исключения, обрабатываются блоком catch и описываются в сигнатуре метода.
Unchecked — непроверяемые — исключения, не обрабатываются блоком catch и не описываются в сигнатуре метода.

1. Throwable — базовый класс для всех исключений языка Java.
2. Error и Exception наследуются от Throwable. Остальные классы являются производными от этих двух классов.
3. Error — класс необрабатываемых исключений языка Java.
4. Exception — класс обрабатываемых исключений программы Java:
— компилятор не обрабатывает такие исключения;
— обязательно указываются с throws;
5. RuntimeException — наследник Exception — класс необрабатываемых исключений программы Java:
— компилятор не обрабатывает такие исключения;
— не обязательно указываются с throws;
— такие исключения — следствия ошибок разработчика (например: неверное преобразование типов или выход за пределы массива);
6. Все классы исключений наследуемые от класса Exception, наследуют ряд его методов, которые позволяют получить информацию о характере исключения. Наиболее важные:
• getMessage() — возвращает сообщение об исключении;
• getStackTrace() — возвращает массив, содержащий трассировку стека исключения;
• printStackTrace() — отображает трассировку стека.

Классы проверяемых исключений (checked exceptions):
ClassNotFoundException — невозможно найти класс;
CloneNotSupportedException — попытка клонировать объект, который не реализует интерфейс Cloneable;
IllegalAccessException — запрещен доступ к классу;
InstantiationException — попытка создать объект абстрактного класса или интерфейса;
InterruptedException — поток прерван другим потоком;
NoSuchFieldException — запрашиваемое поле не существует;
NoSuchMethodException — запрашиваемый метод не существует;
ReflectiveOperationException — исключение, связанное с рефлексией.

Классы непроверяемых исключений (unchecked exceptions):
ArithmeticException — арифметическая ошибка (деление на ноль);
ArrayIndexOutOfBoundsException — выход индекса за границы массива;
ArrayStoreException — присваивание элементу массива объекта несовместимого типа;
ClassCastException — неверное приведение;
EnumConstantNotPresentException — попытка использования неопределённого значения перечисления;
IllegalArgumentException — использование неверного аргумента при вызове метода;
IllegalMonitorStateException — неверная операция мониторинга;
IllegalStateException — некорректное состояние приложения;
IllegalThreadStateException — запрашиваемая операция несовместима с текущим потоком;
IndexOutofBoundsException — индекс вне границ массива;
NegativeArraySizeException — создан массив отрицательного размера;
NullPointerException — использование пустой ссылки;
NumberFormatException — ошибка преобразование строки в число;
SecurityException — попытка нарушения безопасности;
StringIndexOutOfBounds — попытка использования индекса за пределами строки;
TypeNotPresentException — тип не найден;
UnsupportedOperationException — обнаружена неподдерживаемая операция.

Java 8 исключения

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

Исключение (exception)— это событие, которое возникает во время выполнения программы и прерывает нормальный поток выполнения инструкций.

Когда возникает какая-нибудь ошибка внутри метода, метод создаёт специальный объект, называемый объектом-исключением или просто исключением (exception object), который передаётся системе выполнения. Этот объект содержит информацию об ошибке, включая тип ошибки и состояние программы, в котором произошла ошибка. Создание объекта-исключения и передача его системе выполнения называется броском исключения (throwing an exception).

После бросания исключения система пытается найти его обработчик. Система выполнения проходит по стеку вызовов от текущего метода вверх, ища подходящий обработчик исключений.

Выбранный обработчик исключения ловит это исключение.

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

Читать еще:  Как написать игру на javascript

В Java все классы-исключения являются наследниками от класса java . lang . Throwable , который в свою очередь имеет подклассы java . lang . Error и java . lang . Exception . Класс java . lang . Exception имеет дочерний класс java . lang . RuntimeException .

Согласно соглашению все бросаемые исключения являются наследниками трёх классов: java . lang . Error , java . lang . Exception или java . lang . RuntimeException . Технически можно бросить исключение, которое не является наследником этих трёх классов, но является наследником java . lang . Throwable , но так делать не принято.

Виды исключений в Java 8

Из описанных выше трёх классов выходит три вида исключений в Java:

  • Наследники java . lang . Error . Эти исключения возникают при серьёзных ошибках, после которых невозможно нормальное продолжение выполнения программы. Это могут быть различные сбои аппаратуры и т. д. В обычных ситуациях ваш код не должен перехватывать и обрабатывать этот вид исключений.
  • Наследники java . lang . RuntimeException . Это непроверяемый тип исключений вроде выхода за границу массива или строки, попытка обращения к методу на переменной, которая содержит null , неправильное использование API и т. д. В большинстве своём программа не может ожидать подобные ошибки и не может восстановиться после них. Подобные исключения возникают из-за ошибок программиста. Приложения может их перехватывать, но в большинстве случаев имеет гораздо больше смысла исправить ошибку, приводящую к подобным исключениям.
  • Наследники java . lang . Exception , которые НЕ являются наследниками java . lang . RuntimeException . Подобный тип исключений называется проверяемыми исключениями (checked exceptions). Это такой тип исключений, который может ожидать хорошо написанная программа, и из которых она может восстановить свой обычный ход выполнения. Это может быть попытка открыть файл, к которому нет доступа, или которого не существует, проблемы с доступом по сети и т. д. Все исключения являются проверяемыми, кроме наследников java . lang . Error и java . lang . RuntimeException . Любой метод, который может бросить проверяемое исключение, должен указать это исключение в клаузе throws . Для любого кода, который может бросить проверяемое исключение, это исключение должно быть указано в throws метода, либо должно быть перехвачено с помощью инструкции try — catch .

Полное руководство по обработке исключений в Java

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

Обработка исключений в Java. Краткий обзор

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

Java — объектно-ориентированный язык программирования, поэтому всякий раз, когда происходит ошибка при выполнении инструкции, создается объект-исключение, а затем нормальный ход выполнения программы останавливается и JRE пытается найти кого-то, кто может справиться (обработать) это исключение. Объект-исключение содержит много информации об отладке, а именно номер строки, где произошло исключение, тип исключения и т.д.

Что и как происходит, когда появляется ошибка

Когда в методе происходит исключение, то процесс создания объекта-исключения и передачи его в Runtime Environment называется «бросать исключение».

После создания исключения, Java Runtime Environment пытается найти обработчик исключения.

Обработчик исключения — блок кода, который может обрабатывать объект-исключение.

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

У нас есть 3 метода, каждый из которых вызывает друг-друга: А -> В -> С (А вызывает В, а В вызывает С). Если исключение появляется в методе C, то поиск соответствующего обработчика будет происходить в обратном порядке: С -> В -> А (сначала там, где было исключение — в С, если там нет обработчика, то идем в метод В — если тут тоже нет, то идем в А).

Если соответствующий обработчик исключений будет найден, то объект-исключение передаётся обработчику.

Обработать исключение — значит «поймать исключение».

Если обработчик исключений не был найден, то программа завершает работу и печатает информации об исключении.

Обратите внимание, что обработка исключений в Java — это фреймворк, который используется только для обработки ошибок времени выполнения. Ошибки компиляции не обрабатываются рамках обработки исключений.

Основные элементы обработки исключений в Java

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

  • Бросить исключение ( throw ) — ключевое слово, которое используется для того, чтобы бросить исключение во время выполнения. Мы знаем, что Java Runtime начинает поиск обработчика исключений как только оно будет брошено, но часто нам самим нужно генерировать исключение в нашем коде, например, в программе авторизации, если какое-то поле null . Именно для таких случаем и существует возможность бросить исключение.
  • throws — когда мы бросаем исключение в методе и не обрабатываем его, то мы должны использовать ключевое слово throws в сигнатуре метода для того, чтобы пробросить исключение для обработки в другом методе. Вызывающий метод может обработать это исключение или пробросить его еще дальше с помощью throws в сигнатуре метода. Следует отметить, что пробрасывать можно сразу несколько исключений.
  • Блок try-catch используется для обработки исключений в коде. Слово try — это начало блока обработки, catch — конец блока для обработки исключений. Мы можем использовать сразу несколько блоков catch при одном try . catch в качестве параметра принимает тип исключения для обработки.
  • finally — необязательная завершающая конструкция блока try-catch . Как только исключение остановило процесс исполнения программы, в finally мы можем безопасно освободить какие-то открытые ресурсы. Следует отметить, что finally блок выполняется всегда — не смотря на появление исключительной ситуации.
Читать еще:  Int tostring java

Давайте посмотрим простую программу обработки исключений в Java.

А в консоле эта программа напишет такое:

Обратите внимание, что метод testException() бросает исключение, используя ключевое слово throw , а в сигнатуре метода используется ключевое слово throws , чтобы дать понять вызывающему методу тип исключений, которые может бросить testException() .

Важные моменты в обработке исключений:

  • Нельзя использовать блоки catch или finally без блока try .
  • Блок try также может быть использован только с catch блоком, или только с finally блоком, или с тем и другим блоком.
  • Мы можем использовать несколько блоков catch только с одним try .
  • try-catch блоки могут быть вложенными — этим они очень похожи на if-else конструкции.
  • Мы можем использовать только один, блок finally в одном try-catch .

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

Java исключения являются иерархическими, а наследование используется для категоризации различных типов исключений. Throwable — родительский класс в иерархии Java исключений. Он имеет два дочерних объекта — Error и Exception . Исключения далее разделены на проверяемые исключения и исключения времени выполнения.

  1. Error — это тип ошибок, которые выходят за рамки вашей программы, их невозможно предвидеть или обработать. Это может быть аппаратный сбой, «поломка» JVM или ошибка памяти. Именно для таких необычных ситуаций есть отдельная иерархия ошибок. Мы должны просто знать, что такие ошибки есть и не можем справиться с такими ситуациями. Примеры Error : OutOfMemoryError и StackOverflowError .
  2. Проверяемые исключения (Checked Exceptions) — тип исключений, которые мы можем предвидеть в программе и попытаться обработать, например, FileNotFoundException . Мы должны поймать это исключение и написать внятное и полезное сообщение пользователю о том, что произошло (также желательно логировать ошибки). Exception — родительский класс всех проверяемых исключений (Checked Exceptions). Если мы бросили проверяемое исключение, то должны поймать его в том же методе или должны пробросить его с помощью ключевого слова throws .
  3. Runtime Exception — это ошибки программиста. Например, пытаясь получить элемент из массива, мы должны проверить длину массива, прежде чем пытаться получить элемент — в противном случае это может быть брошен ArrayIndexOutOfBoundException . RuntimeException — родительский класс для всех Runtime исключений. Если мы сами бросаем Runtime Exception в методе, то не обязательно указывать в сигнатуре метода ключевое слово throws .

На рисунке 1 представлена иерархия исключений в Java:

Рисунок 1 — Иерархия исключений в Java

Полезные методы в обработке исключений

Класс Exception и все его подклассы не содержат какие-либо методы для обработки исключений. Все предоставляемые методы находятся в базовом классе Throwable . Подклассы класса Exception созданы для того, чтобы определять различные виды исключений. Именно поэтому при обработке исключений мы можем легко определить причину и обработать исключение в соответствии с его типом.

Полезные методы класса Throwable :

  1. public String getMessage() — этот метод возвращает сообщение, которое было создано при создании исключения через конструктор.
  2. public String getLocalizedMessage() — метод, который переопределяют подклассы для локализации конкретное сообщение об исключении. В реализации Throwable класса этот метод просто использует метод g etMessage() , чтобы вернуть сообщение об исключении ( Throwable на вершине иерархии — ему нечего локализировать, поэтому он вызывает getMessage()) .
  3. public synchronized Throwable getCause() — этот метод возвращает причину исключения или идентификатор в виде null , если причина неизвестна.
  4. public String toString() — этот метод возвращает информацию о Throwable в формате String .
  5. public void printStackTrace() — этот метод выводит информацию трассировки стека в стандартный поток ошибок, этот метод перегружен и мы можем передать PrintStream или PrintWriter в качестве аргумента, чтобы написать информацию трассировки стека в файл или поток.

Автоматическое управление ресурсами и улучшения блока перехвата ошибок в Java 7

Если вам нужно перехватывать много исключений в одном блоке try-catch , то блок перехвата будет выглядеть очень некрасиво и в основном будет состоять из избыточного кода. Именно поэтому в Java 7 это было значительно улучшено и теперь мы можем перехватывать несколько исключений в одном блоке catch .

Ссылка на основную публикацию
Adblock
detector