Исключения
В методе, в котором происходит ошибка, создаётся и передаётся специальный объект. Метод может либо обработать исключение самостоятельно, либо пропустить его. В любом случае исключение ловится и обрабатывается. Исключение может появиться благодаря самой системе, либо вы сами можете создать его вручную. Системные исключения возникают при неправильном использовании языка Java или запрещённых приёмов доступа к системе. Ваши собственные исключения обрабатывают специфические ошибки вашей программы.
Вернёмся к примеру с делением. Деление на нуль может предотвратить проверкой соответствующего условия. Но что делать, если знаменатель оказался нулём? Возможно, в контексте вашей задачи известно, как следует поступить в такой ситуации. Но, если нулевой знаменатель возник неожиданно, деление в принципе невозможно, и тогда необходимо возбудить исключение, а не продолжать исполнение программы.
Существует пять ключевых слов, используемых в исключениях: try, catch, throw, throws, finally. Порядок обработки исключений следующий.
Операторы программы, которые вы хотите отслеживать, помещаются в блок try. Если исключение произошло, то оно создаётся и передаётся дальше. Ваш код может перехватить исключение при помощи блока catch и обработать его. Системные исключения автоматически передаются самой системой. Чтобы передать исключение вручную, используется throw. Любое исключение, созданное и передаваемое внутри метода, должно быть указано в его интерфейсе ключевым словом throws. Любой код, который следует выполнить обязательно после завершения блока try, помещается в блок finally
Схематически код выглядит так:
Существует специальный класс для исключений Trowable. В него входят два класса Exception и Error.
Класс Exception используется для обработки исключений вашей программой. Вы можете наследоваться от него для создания собственных типов исключений. Для распространённых ошибок уже существует класс RuntimeException, который может обрабатывать деление на ноль или определять ошибочную индексацию массива.
Класс Error служит для обработки ошибок в самом языке Java и на практике вам не придётся иметь с ним дело.
Прежде чем научиться обрабатывать исключения, нам (как и нормальному любопытному коту) хочется посмотреть, а что происходит, если ошибку не обработать. Давайте разделим число котов в вашей квартире на ноль, хотя мы и знаем, что котов на ноль делить нельзя!
Я поместил код в обработчик щелчка кнопки. Когда система времени выполнения Java обнаруживает попытку деления на ноль, она создаёт объект исключения и передаёт его. Да вот незадача, никто не перехватывает его, хотя это должны были сделать вы. Видя вашу бездеятельность, объект перехватывает стандартный системный обработчик Java, который отличается вредных характером. Он останавливает вашу программу и выводит сообщение об ошибке, которое можно увидеть в журнале LogCat:
Как видно, созданный объект исключения принадлежит к классу ArithmeticException, далее системный обработчик любезно вывел краткое описание ошибки и место возникновения.
Вряд ли пользователи вашей программы будут довольны, если вы так и оставите обработку ошибки системе. Если программа будет завершаться с такой ошибкой, то скорее всего вашу программу просто удалят. Посмотрим, как мы можем исправить ситуацию.
Поместим проблемный код в блок try, а в блоке catch обработаем исключение.
Теперь программа аварийно не закрывается, так как мы обрабатываем ситуацию с делением на ноль.
В данном случае мы уже знали, к какому классу принадлежит получаемая ошибка, поэтому в блоке catch сразу указали конкретный тип. Обратите внимание, что последний оператор в блоке try не срабатывает, так как ошибка происходит раньше строчкой выше. Далее выполнение передаётся в блок catch, далее выполняются следующие операторы в обычном порядке.
Операторы try и catch работают совместно в паре. Хотя возможны ситуации, когда catch может обрабатывать несколько вложенных операторов try.
Если вы хотите увидеть описание ошибки, то параметр e и поможет увидеть ёго.
По умолчанию, класс Trowable, к которому относится ArithmeticException возвращает строку, содержащую описание исключения. Но вы можете и явно указать метод e.toString.
Несколько исключений
Фрагмент кода может содержать несколько проблемных мест. Например, кроме деления на ноль, возможна ошибка индексации массива. В таком случае вам нужно создать два или более операторов catch для каждого типа исключения. Причём они проверяются по порядку. Если исключение будет обнаружено у первого блока обработки, то он будет выполнен, а остальные проверки пропускаются и выполнение программы продолжается с места, который следует за блоком try/catch.
В примере мы добавили массив с тремя элементами, но обращаемся к четвёртому элементу, так как забыли, что отсчёт у массива начинается с нуля. Если оставить значение переменной zero равным нулю, то сработает обработка первого исключения деления на ноль, и мы даже не узнаем о существовании второй ошибки. Но допустим, что в результате каких-то вычислений значение переменной стало равно единице. Тогда наше исключение ArithmeticException не сработает. Но сработает новое добавленное исключение ArrayIndexOutOfBoundsException. А дальше всё пойдёт как раньше.
Тут всегда нужно помнить одну особенность. При использовании множественных операторов catch обработчики подклассов исключений должные находиться выше, чем обработчики их суперклассов. Иначе, суперкласс будет перехватывать все исключения, имея большую область перехвата. Иными словами, Exception не должен находиться выше ArithmeticException и ArrayIndexOutOfBoundsException. К счастью, среда разработки сама замечает непорядок и предупреждает вас, что такой порядок не годится. Увидев такую ошибку, попробуйте перенести блок обработки исключений ниже.
Вложенные операторы try
Операторы try могут быть вложенными. Если вложенный оператор try не имеет своего обработчика catch для определения исключения, то идёт поиск обработчика catch у внешнего блока try и т.д. Если подходящий catch не будет найден, то исключение обработает сама система (что никуда не годится).
Оператор throw
Часть исключений может обрабатывать сама система. Но можно создать собственные исключения при помощи оператора throw. Код выглядит так:
Вам нужно создать экземпляр класса Throwable или его наследников. Получить объект класса Throwable можно в операторе catch или стандартным способом через оператор new.
Мы могли бы написать такой код для кнопки:
Мы объявили объект класса Cat, но забыли его проинициализировать, например, в onCreate(). Теперь нажатие кнопки вызовет исключение, которое обработает система, а в логах мы можем прочитать сообщение об ошибке. Возможно, вы захотите использовать другое исключение, например, throw new UnsupportedOperationException(«Котик не инициализирован»);.
В любом случае мы передали обработку ошибки системе. В реальном приложении вам нужно обработать ошибку самостоятельно.
Поток выполнения останавливается непосредственно после оператора throw и другие операторы не выполняются. При этом ищется ближайший блок try/catch соответствующего исключению типа.
Перепишем пример с обработкой ошибки.
Мы создали новый объект класса NullPointerException. Многие классы исключений кроме стандартного конструктора по умолчанию с пустыми скобками имеют второй конструктор с строковым параметром, в котором можно разместить подходящую информацию об исключении. Получить текст из него можно через метод getMessage(), что мы и сделали в блоке catch.
Теперь программа не закроется аварийно, а будет просто выводить сообщения в всплывающих Toast.
Оператор throws
Если метод может породить исключение, которое он сам не обрабатывает, он должен задать это поведение так, чтобы вызывающий его код мог позаботиться об этом исключении. Для этого к объявлению метода добавляется конструкция throws, которая перечисляет типы исключений (кроме исключений Error и RuntimeException и их подклассов).
Общая форма объявления метода с оператором throws:
В фрагменте список_исключений можно указать список исключений через запятую.
Создадим метод, который может породить исключение, но не обрабатывает его. А в щелчке кнопки вызовем его.
Если вы запустите пример, то получите ошибку. Исправим код.
Мы поместили вызов метода в блок try и вызвали блок catch с нужным типом исключения. Теперь ошибки не будет.
Оператор finally
Когда исключение передано, выполнение метода направляется по нелинейному пути. Это может стать источником проблем. Например, при входе метод открывает файл и закрывает при выходе. Чтобы закрытие файла не было пропущено из-за обработки исключения, был предложен механизм finally.
Ключевое слово finally создаёт блок кода, который будет выполнен после завершения блока try/catch, но перед кодом, следующим за ним. Блок будет выполнен, независимо от того, передано исключение или нет. Оператор finally не обязателен, однако каждый оператор try требует наличия либо catch, либо finally.
Встроенные исключения Java
Существуют несколько готовых системных исключений. Большинство из них являются подклассами типа RuntimeException и их не нужно включать в список throws. Вот небольшой список непроверяемых исключений.
Список проверяемых системных исключений, которые можно включать в список throws.
Создание собственных классов исключений
Система не может предусмотреть все исключения, иногда вам придётся создать собственный тип исключения для вашего приложения. Вам нужно наследоваться от Exception (напомню, что этот класс наследуется от Trowable) и переопределить нужные методы класса Throwable. Либо вы можете наследоваться от уже существующего типа, который наиболее близок по логике с вашим исключением.
Мы создали собственный класс HungryCatException, в методе testMethod() его возбуждаем, а по нажатию кнопки вызываем этот метод. В результате наше исключение сработает.
Создать класс исключения с конструктором, который получает аргумент-строку, также просто.
Ещё вариант. Добавим также метод toString().
Теперь класс содержит два конструктора. Во втором конструкторе используется конструктор родительского класса с аргументом String, вызываемый ключевым словом super.
Перехват произвольных исключений
Можно создать универсальный обработчик, перехватывающий любые типы исключения. Осуществляется это перехватом базового класса всех исключений Exception:
Подобная конструкция не упустит ни одного исключения, поэтому её следует размещать в самом конце списка обработчиков, во избежание блокировки следующих за ней обработчиков исключений.
Основные правила обработки исключений
Используйте исключения для того, чтобы:
Исключения в Java. Часть 1
Разбираемся, что такое исключения, зачем они нужны и как с ними работать.
Из этой статьи вы узнаете:
Код вашей программы исправно компилируется и запускается, только вот вместо желанного результата вы видите непонятный текст. Строчки его будто кричат на вас, аж побагровели.
За примером далеко ходить не надо: сделаем то, что нам запрещали ещё в школе, — поделим на ноль.
Это и есть исключение.
«Исключение» — сокращение от слов «исключительный случай». Это ситуация, в которой программа не может продолжить работу или её работа становится бессмысленной. Причём речь не только о нештатных ситуациях — исключения бывают и намеренными, такие разработчик вызывает сам.
Это интересно. Исключения в Java появились уже в первой версии языка. А вот в языках, где их нет, вместо них возвращают коды ошибок.
Хлебом не корми —
дай кому-нибудь про Java рассказать.
Иерархия исключений и ошибки
У всех классов исключений есть общий класс-предок Throwable, от него наследуются классы Error и Exception, базовые для всех прочих.
Что такое ошибки (Errors)
Error is the superclass of all the exceptions from which ordinary programs are not ordinarily expected to recover.
Что в переводе означает: ошибки (Error) — это такие исключительные ситуации, в которых восстанавливать работу программы не предполагается.
То есть это проблемы, которые нельзя (недопустимо) исправлять на ходу. Всё, что нам остаётся, — извиниться перед пользователем и впредь писать программы, где возникнет меньше подобных ситуаций. Например, не допускать такой глубокой рекурсии, как в коде ниже:
При работе этого метода у нас возникнет ошибка: Exception in thread «main» java.lang.StackOverflowError — стек вызовов переполнился, так как мы не указали условие выхода из рекурсии.
Что такое исключения (Exceptions)
А теперь об Exception. Эти исключительные ситуации возникают, если разработчик допустил невыполнимую операцию, не предусмотрел особые случаи в бизнес-логике программы (или сообщает о них с помощью исключений).
1. Невыполнимая операция
Мир не рухнул, как в случае с Error, просто Java не знает, что делать дальше. Как раз из этого разряда деление на ноль в начале статьи: и правда, какое значение тогда присвоить переменной oops?
Убедитесь сами, что исключение класса ArithmeticException наследуется как раз от Exception.
Другая частая ситуация — обращение к несуществующему элементу массива. Например, у нас в нём десять элементов, а мы пытаемся обратиться к одиннадцатому.
2. Особый случай в бизнес-логике программы
Классика. Программируем задачу о перевозке волка, козы и капусты через реку: в лодке может быть только два пассажира, но волка с козой и козу с капустой нельзя оставлять на берегу вместе. Это и есть особый случай в бизнес-логике, который нельзя нарушать.
Или пользователь вводит дату начала некоторого периода и дату его окончания. Вторая дата не может быть раньше первой.
Или, допустим, у нас есть метод, который читает файл. Сам метод написан верно. Пользователь передал в него корректный путь. Только вот у этого работника нет права читать этот файл (его роль и права обусловлены предметной областью). Что же тогда методу возвращать? Вернуть-то нечего, ведь метод не отработал. Самое очевидное решение — выдать исключение.
В дерево исключений мы ещё углубимся, а сейчас посмотрим, что и как с ними делают.
Что делать с исключениями
Простейший вариант — ничего; возникает исключение — программа просто прекращает работать.
Вводный курс. Язык программирования Java
34. Исключения
Исключение ( exception ) — это ошибка, возникающая во время выполнения ( runtime ) программы. Исключения могут возникать во многих случаях, например: деление на нуль, нулевая ссылка, выход за границы массива, попытка открыть несуществующий файл и другие. Но это не обязательно ошибки программиста. Существуют ситуации, предусмотреть которые невозможно, например, сбой оборудования.
Если возникает ошибка, обработка которой в программе не предусмотрена, выполнение программы будет прервано в строке кода, содержащей ошибку. Такое аварийное завершение работы программы не очень хорошее решение. Рассмотрим, какие решения предлагает Java.
Обработка исключений
В Java используются следующие ключевые слова для работы с исключениями:
Пример программы, в которой не обрабатывается исключительная ситуация, заключающейся в делении на ноль.
После запуска программы при вводе числа 0 на консоль будет выведено следующее сообщение:
0
Exception in thread «main» java.lang.ArithmeticException: / by zero
at myexception.MyException.main(MyException.java:13)
в подпроцессе «main» произошло исключение класса ArithmeticException деления на нуль: «/ by zero». Исключение возникло при выполнении метода main класса MyException.
Выполнение программы прервано на операторе System.out.println(«Результат 1/n= » + 1/n); Последующая строка кода System.out.println(«Программа завершена»); не выполняется и сообщение « Программа завершена» не выводится.
После запуска программы при вводе числа 0 на консоль будет выведено следующее сообщение:
0
Исключение:java.lang.ArithmeticException: / by zero
Программа завершена
Для блока try-catch может быть несколько блоков catch — каждый для своего исключения.
Пример.
Классы исключительных ситуаций
Теперь мы знаем, как обрабатывать исключения, но возникает вопрос, какие исключения обрабатывать? Для ответа на него рассмотрим основные классы исключений
Throwable
|
+——- Error
|
+——- Exceptoin
|
+——- RunTimeExceptoin
|
Throwable — базовый класс для всех исключительных ситуаций.
Error — базовый класс для исключительных ситуаций, вызванных серьёзными сбоями в работе виртуальной машины Java, поэтому не следует пытаться обрабатывать такие исключительные ситуации в собственной программе, поскольку на уровне программы их обработать невозможно. Например, устранить нехватку памяти или переполнение стека.
Exception — это базовый класс для всех тех исключений, которые являются результатом проблем в программе, которые могут быть обработаны и предсказуемы.
Транслятор автоматически обрабатывает ошибки класса RuntimeException, поэтому в программе обрабатывать эти ошибки не нужно.
Классы Error и RuntimeException образуют группу непроверяемых исключительных ситуаций – программисту их проверять не нужно.
Вот перечень основных непроверяемых исключений класса RuntimeException
ArithmeticException
Арифметическая ошибка (например, деление на ноль)
ArrayIndexOutOfBoundsException
Индекс массива за пределами допустимых границ
ArrayStoreException
Присваивание элементу массива недопустимого значения
ClassCastException
Недопустимое приведение типов
IllegalArgumentException
Методу передан недопустимый аргумент
IndexOutOfBoundsException
Некоторый индекс находится за пределами допустимых для него границ
NegativeArraySizeException
Создание массива отрицательного размера
NullPointerException
Недопустимое использование нулевого указателя
NumberFormatException
Недопустимое преобразование текстовой строки в числовой формат
StringIndexOutOfBoundsException
Попытка индексирования вне пределов строки
UnsupportedOperationException
Перечень основыных проверяемых исключений:
· CloneNotSupportedException : класс, для объекта которого вызывается клонирование, не реализует интерфейс Clonable
· InterruptedException : поток прерван другим потоком
ClassNotFoundException : невозможно найти класс
Поскольку все классы исключений наследуются от класса Exception, то все они наследуют ряд его методов, которые позволяют получить информацию о характере исключения. Среди этих методов отметим наиболее важные:
fillInStackTrace()
возвращает объект Throwable, который содержит полную трассировку стека
getLocalizesMessage()
возвращает строку с локализованным описанием исключения
getMessage()
возвращает строку с описанием исключения
printStackTrace()
возвращает массив, содержащий трассировку стека исключения
toString()
возвращает объект класса String, содержащий описание исключения
Оператор throw
Пример.
Будет выведено
0
Число n равно нулю
Программа завершена
Оператор throws
Деление на ноль в Java: Исключение, бесконечность или не число
При делении на ноль целочисленное деление всегда вызывает исключение, но это не относится к числам с плавающей запятой. Давайте посмотрим, почему.
1. Обзор
В этой статье мы рассмотрим что происходит, когда происходит деление на ноль в программе Java.
В соответствии со спецификацией Java операции деления, мы можем идентифицировать два различных случая деления на ноль: целые числа и числа с плавающей запятой.
2. Целые числа
Во-первых, для целых чисел все довольно просто. Деление целого числа на ноль приведет к исключению ArithmeticException :
3. Типы с Плавающей Запятой
Однако при работе с числами с плавающей запятой , исключение не будет выдано :
3.1. НаН
Давайте начнем с деления нулевых значений с плавающей запятой на ноль :
Результатом в этих случаях является NaN (а не число).
3.2. Бесконечность
Далее, давайте разделим некоторые ненулевые значения на ноль :
Как мы видим, результатом является БЕСКОНЕЧНОСТЬ, со знаком, зависящим от знака операндов.
Более того, мы также можем использовать понятие отрицательного нуля, чтобы добраться до NEGATIVE_INFINITY :
3.3. Представление памяти
Итак, почему целочисленное деление на ноль вызывает исключение, а деление с плавающей запятой на ноль-нет?
Давайте посмотрим на это с точки зрения представления памяти. Для целых чисел нет битового шаблона, который можно использовать для хранения результата такой операции, в то время как числа с плавающей запятой имеют значения, такие как NaN или INFINITY , которые будут использоваться в подобных случаях.
Теперь давайте рассмотрим двоичное представление поплавка как S EEEEEEE E FFFFFFF FFFFFFFF FFFFFFFF с одним битом (S) для знака, 8 битами (E) для экспоненты и остальными (F) для мантиссы.
БЕСКОНЕЧНОСТЬ имеет все биты мантиссы равными 0, в то время как NaN имеет ненулевую мантиссу:
4. Резюме
Подводя итог, в этой статье мы увидели, как работает деление на ноль в Java.
Обработка исключения деления на ноль
Вивод который как я думаю должен произойти
Деления на ноль

Как сделать при делении на 0 сообщение «на 0 делить нельзя»? Помогите.
Калькулятор, обработка попытки деления на ноль
Написал прогу в pascalabc.net у него по стандарт. вычислению 9/0=бесконечность, Нужно ограничение.
Решение
Обработка ситуации деления на ноль в простом калькуляторе
Создал калькулятор по примеру из книги Н.Культина «Delphi в задачах и примерах», добавил туда.
Обработка ошибки деления на ноль и выдача своего сообщения
Здравствуйте. У меня появилась не большая проблема, надеюсь на вашу помощь. Суть в том, что когда я.

Создайте консольное приложение. В нем реализуйте нахождение значения выражения 1/(x+n), где n –.
Как сделать ноль результатом деления на ноль?
Народ, подскажите пожалуйста как сделать, чтоб при делении на ноль результат был равен нулю, а не.
Написать программу деления 2-х чисел с проверкой деления на ноль
2.Написать программу деления 2-х чисел с проверкой деления на ноль.
Ошибка деления на ноль
Паскаль подключает модуль ассемблера где асм должен посчитать пример (2*с+d-52)/(a/4+1), для.
Попытка деления но ноль
Добрый вечер! Подскажите пожайлуста. Как записать код вывода ошибки, что на ноль делить.






