Софт-Портал

Exception Java

Рейтинг: 4.9/5.0 (252 проголосовавших)

Категория: Linux

Описание

Поймать Java Exception - Stack Overflow на русском

Разработанное ПО, грузится на tomcat. Cторона клиента построена во flex. Есть 2 базы, с которыми работает ПО. При накате пакетов на тестовую бд возникает ошибка, на промышленной бд такой ошибки не возникает. Ошибка:

java.sql.SQLException: ORA-20000. BS - 1 Ошибка при занесении файла во временные таблицы. ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 380 ,LD - Ошибка загрузки во временные таблицы: ORA-29532: Java call terminated by uncaught Java exception: java.io.IOException. ORA-06512: at "LD.PG_BLOBEXP", line 9 ORA-06512: at "LD.PG_BLOBEXP", line 113 ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 395 ORA-06512: at line 14 ' faultDetail:'null' metasys.ascr.integration.AscrRemoteExeption. org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000]; ORA-20000. BS - 1 Ошибка при занесении файла во временные таблицы. ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 380 ,LD - Ошибка загрузки во временные таблицы: ORA-29532: Java call terminated by uncaught Java exception: java.io.IOException. ORA-06512: at "LD.PG_BLOBEXP", line 9 ORA-06512: at "LD.PG_BLOBEXP", line 113 ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 395 ORA-06512: at line 14 ; nested exception is java.sql.SQLException: ORA-20000. BS - 1 Ошибка при занесении файла во временные таблицы. ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 380 ,LD - Ошибка загрузки во временные таблицы: ORA-29532: Java call terminated by uncaught Java exception: java.io.IOException. ORA-06512: at "LD.PG_BLOBEXP", line 9 ORA-06512: at "LD.PG_BLOBEXP", line 113 ORA-06512: at "BS.BS_FLEX_LOADDOCS", line 395 ORA-06512: at line 14 Server.Processing null

Есть предположение, что админы намудрили с правами. Как можно достать более подробную информацию о ошибке?

задан 2 фев в 11:29

@Dmitry перепроверил код, в тех местах где указывает ORA-06512. никаких к нему претензий нет. Так что возвращаюсь к своему первому вопросу. Как можно вывести более подробную информацию? А Flex, в моем понимании просто служит для Web оформления. Главная проблема взаимодействия Oracle и Java. Я писал что на промышленной базе все работает а на тестовой - вот такая беда. Остается грешить на недостаток привилегий и места загрузки, ибо это другой сервак – Саша Семенец 2 фев в 16:53

А вот что вытянул с "инструментов разработчика", помимо тех что указал вначале: unknown problem occurred during a remote call. faultCode:Server.Processing faultString:'metasys.ascr.integration.AscrRemoteExeption. org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000]; – Саша Семенец 3 фев в 8:01

Exception java:

  • скачать
  • скачать
  • Другие статьи, обзоры программ, новости

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

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

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

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

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

    Синтаксис

    В Java есть пять ключевых слов для работы с исключениями:

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

    Начнем с простого. Допустим мы пишем метод для вычисления площади прямоугольника:

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

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

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

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

    Иногда требуется гарантировать, что определенный участок кода будет выполняться независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода используется ключевое слово 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 возникают вследствие ошибок программирования. Все другие исключения являются следствием непредвиденного стечения обстоятельств, например, ошибок ввода-вывода, возникающих при выполнении вполне корректных программ.

    Здесь основными классами являются Throwable, Error, Exception и RuntimeException. Именно с ними связанна вся "магия".

    Дело в том, что в java есть два типа исключений: checked и unchecked.

    1. Checked исключения, это те, которые должны обрабатываться блоком catch или описываться в сигнатуре метода. Unchecked могут не обрабатываться и не быть описанными.

    2. Unchecked исключения в Java - наследованные от RuntimeException, checked - от Exception (не включая unchecked).

    Пример unchecked исключения - NullPointerException, checked исключения - IOException

    То есть если в вашем коде есть участок который может бросить checked исключение то вы обязаны либо заключить его в конструкцию try/catch либо объявить в сигнатуре метода "throws SomeException" но в данном случае обработка исключения делегируется на уровень выше. В любом случае его нужно будет перехватить. В противном случае программа просто не скомпилируется.

    Почему я выделил Throwable, Error, Exception и RuntimeException.

    Throwable - проверяемое исключение

    Error - не проверяемое

    RuntimeException - не проверяемое

    Все остальные исключения наследуют это свойство от данных классов. Например SQLException является наследником Exception и оно проверяемое. NullPointerException - наследник RuntimeException и оно не проверяемое.

    Так почему не все исключения являются проверяемыми? Дело в том, что если проверять каждое место, где теоретически может быть ошибка, то ваш код сильно разрастется, станет плохо читаемым. Например в любом месте, где происходит деление чисел, нужно было бы проверять на ArithmeticException. потому что возможно деление на ноль. Эту опцию(пере отлавливать не проверяемые исключения) создатели языка оставили программисту на его усмотрение.

    Вернемся к классам исключений:

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

    NullPointerException - ссылка на объект, к которому вы обращаетесь хранит null/

    ClassCastException – Ошибка приведения типов. Всякий раз при приведении типов делается проверка на возможность приведения (проверка осуществляется с помощью instanceof.

    ArithmeticException - бросается когда выполняются недопустимые арифметические операции, например деление на ноль.

    ThreadDeath - вызывается при неожиданной остановке потока посредством метода Thread.stop().

    StackOverflowError - ошибка переполнение стека. Часто возникает в рекурсивных функциях из-за неправильного условия выхода.

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

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

    А вот получившейся стектрейс:

    Exception in thread "main" javatest.MyException

    Caused by: java.lang.IllegalArgumentException: value of 'x' or 'y' is negative: x=-1, y=100

    Таким образом мы создали собственный класс исключения и в конструкторе завернули первичное исключение с помощью initCause(e), и у нас получился такой стектрейс MyException -> IllegalArgumentException.

    Идея initCause(e) в том, что бы заворачивать исключение источник в новое исключение. Таким образом можно будет проще проследить место и причину возникновения ошибки. В каждом исключении будет ссылка на предыдущее исключение, и это напоминает связной список.

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

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

    Здесь если файл не найден, то будет выведено на экран "Oops, FileNotFoundException caught" и программа продолжит работать(в данном случае завершится), если же файл найден, но, например, он не доступен для записи то на экран будет выведено "IOEXCEOTION".

    Важная особенность. последовательность блоков catch должна идти от частного к более общему. В противном случае будет ошибка компиляции.

    В Java 7 стала доступна новая конструкция, с помощью которой можно пере отлавливать несколько исключений одни блоком catch:

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

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

    В Java 7 ввели ещё одну конструкцию, призванную упростить жизнь программисту.

    Если раньше приходилось писать так:

    То теперь это можно сделать так:

    Но где же закрытие потока br? Дело в том, что в Java SE 7 поток BufferedReader реализует интерфейс java.lang.AutoCloseable и теперь в конструкции try-with-resources нет необходимости закрывать его. Удобно и выглядит компактнее :)

    рекомендую ознакомиться с интерфейсом AutoCloseable

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

    Рассмотрим следующий код:

    Он не скомпилируется.

    Дело в том, что метод start() был переопределен в сабклассе и в сигнатуре был указан более общий класс исключения. Согласно правилам переопределения методов. это действие не допустимо.

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

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

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

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

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

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

    Заключение

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

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

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

    vovanok nagibator000 Glare admin zpytnjv mathkiller fdk512 Arin alexgiant ezozulya xxxshark93 dozor720 Zusy_MT polynachik15 Alibek7000 Heorhi_Puhachou merrymirta andrik92 whak pristroistvo_ek edivaliev CullyCross yachmenev sadkoua Aruy fanshtorm Selfing TwoGreG Slevin_k shashpash jacksolovey MashaHalushko Violinist inna5 yegorovadaria nikita88pkr alx_kish KZ_Jumper rudnitskij ig_gor OlyaIvanova sedovev pomanitz npn77 SKS rafMaestro demondarkisle Saddius roman_osad94 benzotopor Den_b hoz ellobo12

    RuntimeException, Exception и, например, SQLException, разница?

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1154

    если коротко то так:
    корень всех бед в Java.

    системные ошибки (серьезные), их прикладным программистам обрабатывать не надо. В идеале это то что никогда не должно произойти. Писать такие ошибки в сигнатуру метода throws не надо. (Пример java машина падает по OutOfMemoryError.

    проверяемые исключения, за их обработкой следит компилятор. Код не откомпилируется пока код не будет помещен в блок try/catch или нужно добавить throws. Некоторые считают что проверяемые исключения зло.

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

    Re: RuntimeException, Exception и, например, SQLException, разница? [new]

    Откуда:
    Сообщений: 98

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

    В чём отличие Exception, RuntimeException и Error - тоже понимаю. Но заданный вопрос пока без ответа.

    В чём отличие для компилятора между Exception и SQLException? Оба являются checked, должны либо явно перехватываться, либо объявляться как throws.

    Почему в одном случае компилятор выдаёт ошибку, а в другом нет? Может быть потому, что RuntimeException наследуется от Exception и не наследуется от SQLException?

    Re: RuntimeException, Exception и, например, SQLException, разница? [new]

    Откуда: Таможенный союз (Россия, Казахстан)
    Сообщений: 1154

    Но заданный вопрос пока без ответа.

    Нужен пример кода чтобы понимать о чем речь идет, а то так долго можно гадать.

    Исключения в Java и их обработка

    Исключения и их обработка

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

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

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

    Исключения делятся на несколько классов, но все они имеют общего предка — класс Throwable. Его потомками являются подклассы Exception и Error.

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

    Ошибки (Errors) представляют собой более серьёзные проблемы, которые, согласно спецификации Java, не следует пытаться обрабатывать в собственной программе, поскольку они связаны с проблемами уровня JVM. Например, исключения такого рода возникают, если закончилась память, доступная виртуальной машине. Программа дополнительную память всё равно не сможет обеспечить для JVM.

    В Java все исключения делятся на три типа: контролируемые исключения (checked) и неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors) и исключения времени выполнения (RuntimeExceptions, потомок класса Exception).

    Контролируемые исключения представляют собой ошибки, которые можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception (но не RuntimeException).

    Обработка исключения может быть произведена с помощью операторов try…catch, либо передана внешней части программы. Например, метод может передавать возникшие в нём исключения выше по иерархии вызовов, сам его не обрабатывая.

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

    Откомпилируем и запустим такую программу:

    В момент запуска на консоль будет выведено следующее сообщение:

    Из сообщения виден класс случившегося исключения — ArithmeticException. Это исключение можно обработать:

    Теперь вместо стандартного сообщения об ошибке будет выполняться блок catch, параметром которого является объект e соответствующего исключению класса (самому объекту можно давать любое имя, оно потребуется в том случае, если мы пожелаем снова принудительно выбросить это исключение, например, для того, чтобы оно было проверено каким-то ещё обработчиком).

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

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

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

    Если пользователь введёт 0, то возникнет исключение класса ArithmeticException, и оно будет обработано первым блоком catch.

    Если пользователь введёт 3, то возникнет исключение класса ArrayIndexOutOfBoundsException (выход за приделы массива), и оно будет обработано вторым блоком catch.

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

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

    Поскольку исключения построены на иерархии классов и подклассов, то сначала надо пытаться обработать более частные исключения и лишь затем более общие. То есть поставив первым (а не третьим) блок с обработкой исключения класса Exception, мы бы никогда не увидели никаких сообщений об ошибке, кроме «Произошло ещё какое-то исключение» (все исключения перехватились бы сразу этим блоком и не доходили бы до остальных).

    Необязательным добавлением к блокам try…catch может быть блок finally. Помещенные в него команды будут выполняться в любом случае, вне зависимости от того, произошло ли исключение или нет. При том, что при возникновении необработанного исключения оставшаяся после генерации этого исключения часть программы — не выполняется. Например, если исключение возникло в процессе каких-то длительных вычислений, в блоке finally можно показать или сохранить промежуточные результаты.

    © 2010, Алексей Николаевич Костин. Кафедра ТИДМ математического факультета МПГУ.

    Как настроить список сайтов-исключений?

    Как настроить список сайтов-исключений? Этот раздел касается:
    • Версии Java: 7.0, 8.0

    В версии Java 7 (обновление 51) введена функция Exception Site List. Добавление URL-адреса приложения в данный список исключений позволяет пользователям выполнять RIA-приложения (Rich Internet Applications), которые обычно не проходят проверки системы безопасности.

    Ниже перечислены случаи, когда выполнение приложений, URL-адреса которых добавлены в список сайтов-исключений, разрешено.
    • Если приложение не подписано с помощью сертификата доверенного центра сертификации.
    • Если приложение размещается локально.
    • У JAR-файла нет атрибута манифеста Permissions.
    • Приложение подписано сертификатом с истекшим сроком действия.
    • Не удается проверить, был ли отозван сертификат, с помощью которого подписано приложение.
    Управление списком сайтов-исключений

    Для управления списком сайтов-исключений используется вкладка Securityпанели управления Java. Список отображается на этой вкладке. Чтобы добавить URL-адрес в список, изменить его или удалить из списка, нажмите Edit Site List (Изменить список веб-сайтов).

    Поиск панели управления Java Добавление URL-адреса
    1. Нажмите кнопку Edit Site List .
    2. Нажмите кнопку Add (Добавить) в окне "Exception Site List".
    3. Щелкните пустую область в поле "Location" (Местоположение), чтобы ввести URL-адрес.
      URL-адрес должен начинаться с http:// или https://
      , например: http://myexample.com. https://myexample.com
    4. Нажмите кнопку OK. чтобы сохранить введенный URL-адрес. При нажатии на кнопку Отмена URL-адреса не сохраняются.
    5. Нажмите кнопку Continue (Продолжить) в диалоговом окне "Security Warning" (Предупреждение системы безопасности).

    Формат URL-адреса
    • Необходимо указать протокол и домен.
      Поддерживаемые протоколы: FILE. HTTP и HTTPS. Рекомендуемый протокол - HTTPS. Если указан протокол, отличный от HTTPS. отображается предупреждение.
    • Номер порта требуется, только если не используется порт по умолчанию.
    • Путь указывается по желанию.
    • Специальные символы не поддерживаются.
      • Если указан только домен, будет разрешен запуск любого приложения RIA из этого домена. Для одного домена может существовать несколько записей, например https://www.example.com и http://www.example.com.
      • Если путь оканчивается косой чертой (/), например https://www.example.com/apps/. будет разрешен запуск приложений RIA, находящихся в указанном каталоге и вложенных папках. Если путь не оканчивается косой чертой, например http://www.example.com/test/applet.html. будет разрешен запуск только указанного приложения RIA.

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

    Если указан недопустимый URL-адрес, рядом с ним отображается значок ошибки. Если недопустимый URL-адрес не был исправлен до нажатия на кнопку OK. он не сохраняется.

    Изменение URL-адреса
    1. Дважды щелкните URL-адрес, который требуется изменить, в окне "Exception Site List".
    2. Измените URL-адрес.
    3. Нажмите кнопку OK. чтобы сохранить изменения. При нажатии на кнопку Отмена не сохраняются никакие изменения.
    Удаление URL-адреса
    1. Щелкните URL-адрес, который требуется удалить, в окне "Exception Site List".
    2. Нажмите кнопку Remove (Удалить).
    3. Нажмите кнопку OK. чтобы сохранить изменение. Нажатие на кнопку Отмена не приводит к удалению URL-адресов из списка.
    СМОТРИТЕ ТАКЖЕ

    Если URL-адрес размещения апплета отличается от URL-адреса веб-страницы, с которой запускается этот апплет, необходимо добавить и URL-адрес апплета, и URL-адрес веб-страницы.

    Пример использования разных URL-адресов для апплета и веб-страницы

    Для игр Yahoo Checkers (Шашки) потребуется указать оба URL-адреса (URL-адреса в списке могут различаться в зависимости от хоста, обслуживающего игру)

    1. http://www.games.yahoo.com
      Это URL-адрес домена Yahoo! Games
    2. http://yog36.games.sp2.yahoo.com
      Это URL-адрес размещения игрового приложения, который отображается в диалоговом окне для заблокированного приложения
    ДОПОЛНИТЕЛЬНАЯ ТЕХНИЧЕСКАЯ ИНФОРМАЦИЯ Набор правил развертывания

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

    См. также

    Java: Операторы throw и throws

    9.7. Оператор throw

    Оператор throw используется для возбуждения исключения «вручную». Для того чтобы сделать это, нужно иметь объект подкласса класса Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. Ниже приведена общая форма оператора throw,

    При достижении этого оператора нормальное выполнение кода немедленно прекращается, так что следующий за ним оператор не выполняется. Ближайший окружающий блок try проверяется на наличие соответствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, то проверяется следующий из вложенных операторов try и так до тех пор, пока либо не будет найден подходящий раздел catch, либо обработчик исключений исполняющей системы Java не остановит программу, выведя при этом состояние стека вызовов. Ниже приведен пример, в котором сначала создается объект-исключение, затем оператор throw возбуждает исключительную ситуацию, после чего то же исключение возбуждается повторно — на этот раз уже кодом перехватившего его в первый раз раздела catch.

    class ThrowDemo <
    static void demoproc() <
    <
    throw new NullPointerException("demo");
    >
    catch (NullPointerException e) <
    System.out.println("caught inside demoproc");
    throw e;
    >
    >

    public static void main(String args[]) <
    try <
    demoproc();
    >
    catch(NulPointerException e) <
    System.out.println("recaught:" + e);
    >
    >
    >

    В этом примере обработка исключения проводится в два приема. Метод main создает контекст для исключения и вызывает demoproc. Метод demoproc также устанавливает контекст для обработки исключения, создает новый объект класса NullPointerException и с помощью оператора throw возбуждает это исключение. Исключение перехватывается в следующей строке внутри метода demoproc, причем объект-исключение доступен коду обработчика через параметр «е». Код обработчика выводит сообщение о том, что возбуждено исключение, а затем снова возбуждает его с помощью оператора throw, в результате чего оно передается обработчику исключений в методе main. Ниже приведен результат, полученный при запуске этого примера.

    С:\>javaThrowDemo
    caught inside demoproc
    recaught: java.lang.NullPointerException: demo

    9.8. Оператор throws

    Если метод способен возбуждать исключения, которые он сам не обрабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений. Для задания списка исключений, которые могут возбуждаться методом, используется оператор throws. Если метод в явном виде (т.е. с помощью оператора throw) возбуждает исключение соответствующего класса, тип класса исключений должен быть указан в операторе throws в объявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен быть расширен следующим образом:

    тип имя_метода(список аргументов)throwsсписок исюпочений <>

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

    Для того чтобы мы смогли оттранслировать этот пример, нам придется сообщить транслятору, что procedure может возбуждать исключения типа IllegalAccessException и в методе main добавить код для обработки этого типа исключений:

    class ThrowsDemo <
    static void procedure() throws IllegalAccessException
    <
    System.out.println(" inside procedure");
    throw new IllegalAccessException("demo");
    >
    public static void main(String aigs[]) <
    try<
    procedure();
    >
    catch (IllegalAccessException e) <
    System.out.println("caught" + e);
    >
    >
    >

    Ниже приведен результат выполнения этой программы.

    С:\> java ThrowsDemo
    inside procedure
    caught javaJangIllegalAccessException: demo

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

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

    Чтобы создать свой класс исключений, надо унаследовать его от класса Exception. Например, у нас есть класс, вычисляющий факториал, и нам надо выбрасывать специальное исключение, если число, передаваемое в метод, меньше 1:

    Здесь для определения ошибки, связанной с вычислением факториала, определен класс FactorialException. который наследуется от Exception и который содержит всю информацию о вычислении. В конструкторе FactorialException в конструктор базового класса Exception передается сообщение об ошибке: super(message). Кроме того, отдельное поле предназначено для хранения числа, факториал которого вычисляется.

    Для генерации исключения в методе вычисления факториала выбрасывается исключение с помощью оператора throw: throw new FactorialException("Число не может быть меньше 1", num). Кроме того, так как это исключение не обрабатывается с помощью try..catch, то мы передаем обработку вызывающему методу, используя оператор throws: public static int getFactorial(int num) throws FactorialException

    Теперь используем класс в методе main:

    Exception java

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

    Некоторые вещи иногда работают не так, как подсказывает интуиция. Это утверждение можно отнести к обработке исключений в Java. Далее - ситуации и примеры кода, которые отражают имеющиеся нюансы.

    Самый простой случай, исключение случается:

    Вывод прост и интуитивно понятен:

    Исключения случаются, но мы их ловим:

    Здесь тоже всё элементарно:
    Заодно добавился блок finally, который выполняется всегда, было исключение или его не было, вышли мы из метода, или нет.


    Исключения случаются, мы их ловим и. отменяем:

    А вот этот вариант показывает тот момент, на котором я засыпался месяца три тому на собеседовании:

    Блок finally исполняется всегда, кроме того, он может переопределить результат возврата из метода, если тот произошёл в try/catch.


    И даже с многопоточностью?


    А теперь - печеньки!

    Даже нормальном завершении программы, в потоках типа "daemon" блок finally не отрабатывает.


    Имеет место ещё и такой вариант:

    И здесь блок finally будет тоже проигнорирован. Вместо System.exit(int) можно использовать Runtime.getRuntime().halt(int);

    Копирование материалов запрещено.