1. Введение
Попробуйте ... поймать ... Наконец, это, вероятно, предложение, с которым все знакомы, и оно кажется очень простым в использовании, и, кажется, логически легко понять. Тем не менее, «обучение», которое я испытал лично, сказал мне, что эта штука не так просто и послушна, как я себе представлял. Не верите в это? Затем посмотрите на код ниже, каким будет результат после его выполнения? Не смотрите на ответы задом наперед, и при этом вы не позволяете выполнять код, чтобы увидеть реальные ответы. Если ваш ответ верен, вам не нужно тратить время на чтение этой статьи.
Пакет -тест; public class testexception {public testexception () {} boolean testex () выбрасывает exection {boolean ret = true; try {ret = testex1 (); } catch (Exception e) {System.out.println ("testex, catch Exception"); ret = false; бросить E; } наконец {System.out.println ("testex, наконец; return value =" + ret); вернуть вт; }} boolean testex1 () throws exception {boolean ret = true; try {ret = testex2 (); if (! ret) {вернуть false; } System.out.println ("testex1, в конце попытки"); вернуть вт; } catch (Exception e) {System.out.println ("testex1, catch Exception"); ret = false; бросить E; } наконец {System.out.println ("testex1, наконец; return value =" + ret); вернуть вт; }} boolean testex2 () throws exception {boolean ret = true; попробуйте {int b = 12; int c; for (int i = 2; i> = -2; i--) {c = b / i; System.out.println ("i =" + i); } вернуть true; } catch (Exception e) {System.out.println ("testex2, catch Exception"); ret = false; бросить E; } наконец {System.out.println ("testex2, наконец; return value =" + ret); вернуть вт; }} public static void main (string [] args) {testException testException1 = new TestException (); try {testexception1.testex (); } catch (Exception e) {e.printstackTrace (); }}} Какой у вас ответ? Это ответ ниже?
i = 2
i = 1
testex2, поймать исключение
testex2, наконец; возвращаемое значение = false
testex1, поймать исключение
testex1, наконец; возвращаемое значение = false
Testex, поймайте исключение
Testex, наконец; возвращаемое значение = false
Если ваш ответ действительно такой, как упомянуто выше, то вы ошибаетесь. ^_^, затем я предлагаю вам внимательно прочитать эту статью или использовать приведенный выше код для изменения, выполнения и тестирования в соответствии с различными ситуациями. Вы обнаружите, что есть много вещей, которые не так просты, как изначально. Теперь опубликуйте правильный ответ:
i = 2
i = 1
testex2, поймать исключение
testex2, наконец; возвращаемое значение = false
testex1, наконец; возвращаемое значение = false
Testex, наконец; возвращаемое значение = false
Примечание:
Наконец, блок оператора не должен появляться, возврат должен появиться. Возврат выше, предпочтительно, является еще одним оператором для обработки соответствующей логики.
2. Исключение Java
Исключения относятся к различным ситуациям, которые возникают неожиданно, такие как: файл не найден, сбой сетевого соединения, незаконные параметры и т. Д. Исключение - это событие, которое происходит во время запуска программы и мешает нормальному потоку инструкций. Java описывает различные исключения на многих подклассах брошенного класса в API. Поэтому исключениями Java являются объектами, экземплярами броски подклассов, описывающие условия ошибки, которые появляются в кодировании. При создании условия ошибка принесет исключение.
Java Exception Class Class Diagram:
Рисунок 1 Диаграмма иерархии класса исключений Java
В Java все исключения имеют общего предка, бросаемого (бросаемого). Throwable указывает общность любых проблем, которые могут быть переданы с помощью Java -приложений в коде с помощью механизмов распространения исключений.
Бросая: Есть два важных подкласса: исключение и ошибка. Оба являются важными подклассами для обработки исключений Java, и каждый содержит большое количество подклассов.
Ошибка: ошибка, с которой программа не может обрабатывать, что указывает на серьезную проблему при запуске приложения. Большинство ошибок не связаны с действиями, выполняемыми автором кода, но представляют проблемы с JVM (виртуальная машина Java) при запуске кода. Например, виртуальная машина Java запускает ошибку (виртуальное пучковое), и OutofmemoryError появится, когда JVM больше не имеет ресурсов памяти, необходимых для продолжения работы. Когда эти исключения происходят, виртуальная машина Java (JVM) обычно выбирает прекращение потоков.
Эти ошибки указывают на то, что сбой возникает, когда сама виртуальная машина или когда виртуальная машина пытается выполнить приложение, например, виртуальная машина Java, выполняющая ошибку (виртуальная машина), ошибка определения класса (noclassdeffounderror) и т. Д. Эти ошибки не определяются, потому что они находятся вне контроля и способности обработки применения, и большинство из них являются ситуациями. Для хорошо продуманного приложения, даже если возникает ошибка, она не должна по существу пытаться справиться со исключениями, которые она вызывает. В Java ошибка описывается подклассом ошибки.
Исключение: исключение, с которым сама программа может справиться.
Класс исключений имеет важный подкласс, Runtimeexception. Класс runtimeexception и его подклассы представляют ошибку, вызванную «общими операциями JVM». Например, если вы пытаетесь использовать ссылку на нулевое объект, нулевой делитель или массив из границ, исключение времени выполнения (NullPointerException, Arithmeticexception) и ArrayIndexoutOfBoundException, соответственно.
ПРИМЕЧАНИЕ. Разница между исключениями и ошибками: исключения могут быть обработаны самой программой, но ошибки не могут быть обработаны.
Как правило, исключения Java (включая исключение и ошибку) делятся на проверенные исключения и неконтролируемые исключения.
Исключения могут быть проверены (исключения, которые должны обрабатывать компилятор): это легко произойти, и разумные и терпимые исключения, когда работает правильная программа. Хотя проверенное исключение является ненормальным условием, его возникновение в определенной степени предсказуемо, и как только возникает такое ненормальное состояние, оно должно быть обработано каким -то образом.
За исключением Runtimeexception и его подклассов, другие классы исключений и их подклассы - все это проверяемые исключения. Характеристика этого исключения заключается в том, что компилятор Java проверит его, то есть, когда такое исключение может произойти в программе, либо поймает его с помощью оператора Try-Catch, либо бросьте с помощью пункта бросков, в противном случае компиляция не пройдет.
Невыполнимые исключения (исключения, что компилятор не требует принудительного распоряжения): включая исключения времени выполнения (Runtimeexception и его подклассы) и ошибки (ошибка).
Исключение Это исключение делится на две категории: исключение времени выполнения и исключение без прохождения (исключение компиляции). Эти исключения должны быть обработаны как можно больше в программе.
Исключения во время выполнения: все они являются классом Runtimeexception и его исключениями подкласса, такими как NullPointerException (исключение NULL Pointer), IndexoutOfBoundSexception (подростковое исключение) и т. Д. Эти исключения обычно вызваны ошибками логики программы, и программы должны как можно больше избегать таких исключений с логической точки зрения.
Характеристика исключения времени выполнения заключается в том, что компилятор Java не будет проверять его. То есть, когда такое исключение может произойти в программе, даже если оно не запечатлено с помощью оператора Try-Catch и брошено в предложение бросков, оно будет составлено и передано.
Неудача исключения (исключение компиляции): является исключением, отличным от Runtimeexception, и принадлежит классу исключений и его подклассы с точки зрения типа. С точки зрения синтаксиса программы, это исключение, которое должно быть обработано. Если это не обработано, программа не может быть составлена и передана. Такие как IOException, SQLexception и т. Д., А также исключения исключений, определенные пользователем, в целом не проверяются исключения по индивидуальной проверке.
3. Механизм обработки исключений
В приложениях Java механизм обработки исключений: бросить исключения и уловить исключения.
Выбросьте исключение: когда ошибка возникает в методе и поднимает исключение, метод создает объект исключения и доставляет его в систему времени выполнения. Объект исключения содержит информацию об исключении, такую как тип исключения и статус программы, когда происходит исключение. Система времени выполнения отвечает за поиск и выполнение кода для обработки исключений.
Исключение Catch: после того, как метод бросил исключение, система выполнения будет обращена к поиску подходящего обработчика исключений. Потенциальным обработчиком исключений является набор методов, которые остаются в стеке вызовов по очереди, когда происходит исключение. Когда тип исключения, который может обрабатывать процессор исключений, согласуется с типом исключения, брошенным методом, он является подходящим процессором исключений. Система времени выполнения начинается с метода, где происходит исключение, а затем оглядывается на методы в стеке вызовов, пока она не найдет метод, содержащий подходящий обработчик исключений и выполняет его. Когда система времени выполнения пересекает стек вызовов и не находит подходящего обработчика исключений, система времени выполнения заканчивается. В то же время это означает прекращение программы Java.
Для исключений времени выполнения, ошибок или обнаруживаемых исключений методы обработки исключений, необходимые для технологии Java, различны.
Из -за неопределяемых исключений во время выполнения, чтобы реализовать приложение более разумно и легко и легко, Java предусматривает, что исключения времени выполнения будут автоматически брошены системой времени выполнения Java, что позволяет приложению игнорировать исключения во время выполнения.
Для ошибок, которые могут возникнуть во время работы метода, Java позволяет методу не бросать никакого объявления, когда метод не должен быть захвачен. Поскольку большинство исключений ошибок - это ситуации, которые никогда не могут возникнуть, а также являются исключениями, что разумные приложения не должны ловить.
Для всех проверенных исключений Java предусматривает, что метод должен быть пойман или объявлен вне метода броска. То есть, когда метод предпочитает не ловить проверенное исключение, он должен заявить, что исключение будет брошено.
Метод, который может завоевать исключения, требует предоставления соответствующего типа обработчика исключений. Захватываемое исключение может быть вызвано исключением, поднятым и брошенным его собственным утверждением, или исключением, вызванным именованным методом или системой времени выполнения Java, и т. Д. Другими словами, исключение, что метод может быть исключением, должен быть что -то подключен кодом Java. Проще говоря, исключения всегда бросаются сначала, а затем поймают.
Любой код Java может добавлять исключения, такие как: код, написанный вами, код из пакета среды разработки Java или система выполнения Java. Независимо от того, кто это, вы можете бросить исключение через заявление о броске Java.
Любое исключение, выброшенное из метода, должно использоваться с пунктом бросков.
Исключения поймать достигаются с помощью операторов за тридцатистики или операторов, которые финально-финальные операторы.
Вообще говоря, Java предусматривает, что проверенные исключения должны быть пойманы или объявлены. Позволяет игнорировать неконтролируемое Runtimeexception и ошибку.
3.1 Установите исключения: попробуйте, поймайте и наконец
1. Заказывать заявление
В Java исключения пойманы за то, что он затрагивает заявление. Его общая форма синтаксиса:
try {// программный код, где могут возникнуть исключения} catch (type1 id1) {// catch и разбирайтесь с типом исключения, брошенным Try type1} catch (type2 id2) {// catch и разбирайтесь с типом исключения, брошенным Try type2}Пара скобков после ключевого слова пробует кусок кода, который может иметь исключение, которое называется области мониторинга. Если исключение происходит во время метода Java во время работы, создается объект исключения. Выбросьте исключение за пределы зоны мониторинга, и система выполнения Java пытается найти соглашение о подходящем ущербе, чтобы поймать исключение. Если есть соглашение о соответствующем ущербе, запустите его код обработки исключений, а оператор Try-Catch заканчивается.
Принцип сопоставления заключается в следующем: если объект исключения, который выбрасывается, принадлежит классу исключений предложения по уловке или принадлежит подклассу класса исключений, считается, что сгенерированный объект исключения соответствует типу исключения, пойманной блоком улова.
Пример 1 Поймайте исключение "Dividter - это 0", брошенное заявлением Throw.
public class testexception {public static void main (string [] args) {int a = 6; int b = 0; Попробуйте {// Попробуйте область мониторинга, если (b == 0) бросить новый arithmeticexception (); // бросить исключение через System System. } catch (arithmeticexception e) {// Catch Catch Exception System.out.println («Программа имеет исключение, а переменная b не может быть 0.»); } System.out.println («Программа заканчивается нормально»); }}Результат работы: программа имеет исключение, и переменная B не может быть 0.
Программа заканчивается нормально.
Пример 1 В зоне мониторинга TRY используйте заявление, если судья. Когда устанавливается условие ошибки «разделитель 0», создается исключение Arithmeticexception, и оператор Throw выбрасывает исключение из системы выполнения Java. Система обнаруживает подходящий подъем обработчика исключений и запускает соответствующий код обработки исключений. Распечатайте «У программы есть исключение, и переменная B не может быть 0.» Заявление Try-Catch заканчивается и продолжает поток программы.
На самом деле, арифметикекса, такое как «Разделение 0», является подклассом Runtimexception. Исключение времени выполнения будет автоматически брошено системой среды выполнения, и нет необходимости использовать оператор Throw.
Пример 2: Поймайте исключение arithmeticexception, вызванное «разделителем, 0», автоматически бросая во время системы выполнения.
public static void main (string [] args) {int a = 6; int b = 0; try {System.out.println («Значение A / B IS:» + A / B); } catch (arithmeticexception e) {System.out.println («Программа имеет исключение, а переменная B не может быть 0.»); } System.out.println («Программа заканчивается нормально»); }}Результат работы: программа имеет исключение, и переменная B не может быть 0.
Программа заканчивается нормально.
Заявление в Примере 2:
System.out.println ("a/b Значение:" + a/b);Во время выполнения была сгенерирована ошибка «Разделитель 0», и было поднято исключение по арифметикексации. Система времени выполнения создает объект исключения и бросает область мониторинга, вместо этого соответствует соответствующему уловке обработчика исключений и выполняет соответствующий код обработки исключений.
Поскольку стоимость проверки исключений во время выполнения намного больше, чем преимущества ловли исключений, исключения во время выполнения не могут быть обнаружены. Компилятор Java позволяет игнорировать исключения времени выполнения, и метод не может ни ловить, ни объявлять исключения времени выполнения.
Пример 3: нет подъема и не заявляйте, что исключение среды выполнения отброшено.
public class testexception {public static void main (string [] args) {int a, b; a = 6; b = 0; // значение Divisor B равен 0 System.out.println (a / b); }}Результаты работы:
Исключение в потоке "Main" java.lang.arithmeticexception: / by Zero
at test.testexception.main (testexception.java:8)
Пример 4 Программа может занять исключение Divisor 0 и исключение подписания массива.
public class testexception {public static void main (string [] args) {int [] intarray = new int [3]; try {for (int i = 0; i <= intarray.length; i ++) {intarray [i] = i; System.out.println ("intarray [" + i + "] =" + intarray [i]); System.out.println ("intarray [" + i + "] модуль" + (i - 2) + "значения:" + intarray [i] % (i - 2)); }} catch (arrayindexoutofboundsexception e) {system.out.println ("Интеграбр Intarray Array Suppipt вне исключения."); } catch (arithmeticexception e) {System.out.println ("Исключение Divisor 0."); } System.out.println ("Программа заканчивается нормально."); }}Результаты работы:
Intarray [0] = 0
Intarray [0] Значение модуля-2: 0
Intarray [1] = 1
Значение Intarray [1] Modulo-1: 0
Intarray [2] = 2
За исключением делителя 0.
Программа заканчивается нормально.
Пример 5 Программа может испытывать исключение Divisor 0, и может также возникнуть исключение из абонентов Array. Во время запуска программы сначала сопоставит тип исключений Arithmeticexception, поэтому соответствующий оператор Catch выполняется:
catch (arithmeticexception e) {System.out.println ("Исключение Divisor 0."); }Следует отметить, что после того, как улов улова закроет подходящий тип исключения, он введет код обработки исключений. Как только обработка завершена, это означает, что весь оператор Try-Catch заканчивается. У других пунктов улова больше нет шансов соответствовать типам исключений.
Java описывает типы исключений с помощью классов исключений, а иерархия классов исключений показана на рисунке 1. Для программ исключений с несколькими положениями об уловах вы должны попытаться поместить предложение по уловку, которая сначала улавливает базовый класс исключений, и попытаться поместить пункт об уловах, который поймает на относительно высокий класс исключений. В противном случае, пункт о уловах, который ловит базовый класс исключений, вероятно, будет заблокирован.
Класс исключений Runtimeexception включает в себя различные общие исключения во время выполнения, а класс Arithmeticexception и класс ArrayIndexoutOfBoundSexception - оба подклассы. Следовательно, пункт об уловах класса исключений Runtimeexception должен быть размещен в конце, в противном случае он может заблокировать последующую обработку исключений или вызвать ошибку компиляции.
2. Попробуйте, финально утверждение
Заявление Try-Catch также может включать третью часть, которая является предложением наконец. Это указывает на то, что должно быть выполнено независимо от того, происходит ли исключение или нет. Общая синтаксисная форма оператора Fry-Catch-Finally:
try {// программный код, который может произойти исключение} catch (type1 id1) {// catch и обработать тип исключения, брошенный с помощью Try type1} catch (type2 id2) {// catch и обработать тип исключения, выброшенный с помощью Try type2}, наконец, {// блок операторов, которые будут выполнены независимо от того, происходит ли исключение}Пример 6 Обработчик исключений с пунктом, наконец,.
public class testexception {public static void main (string args []) {int i = 0; Приветствия строки [] = {«Привет, мир!», «Привет, мир !!», «Привет, мир !!!» }; while (i <4) {try {// Обратите особое внимание на конструкцию переменной управления циклом i, чтобы избежать создания бесконечных петлей System.out.println (приветствия [i ++]); } catch (arrayIndexoutOfBoundSexception e) {System.out.println ("ArraysubScript upbuls Exception"); } наконец {System.out.println ("--------------------------"); }}}}Результаты работы:
Привет, мир!
--------------------------------
Привет, мир !!
--------------------------------
ПРИВЕТ, МИР!!!
--------------------------------
Массивский индекс вне границ исключений
--------------------------------
В примере 6, пожалуйста, обратите особое внимание на дизайн блока операторов в пункте TRY. Если дизайн выглядит следующим образом, произойдет мертвая петля. При разработке как:
try {System.out.println (приветствие [i]); i ++; }краткое содержание:
Попробуйте блок: используется, чтобы поймать исключения. После этого может быть подключено ноль или более блоков улова. Если нет блока улова, за ним должен следить наконец -то блок.
Поймайте блок: используется для обработки исключений, пойманных Try.
Наконец -то Block: операторы в блоке, наконец, будут выполнены независимо от того, поймано ли исключение или обработано. Когда обратный оператор встречается в блоке Try Block или Catch, блок оператора наконец -то будет
Выполняет до возвращения метода. В следующих 4 особых случаях блок, наконец, не будет выполнен:
1) Исключение произошло в блоке окончательного оператора.
2) Используйте System.exit () в предыдущем коде для выхода из программы.
3) Поток, где находится программа, умирает.
4) Выключите процессор.
3. Правило FUNCATE-FINALL (грамматическое правило для обработки исключений):
1) Улов или, наконец, блок должен быть добавлен после попытки. После блока Try, залов и, наконец, блоки могут быть подключены одновременно, но есть хотя бы один блок.
2) Заказ блока должен соблюдаться: если код использует как ловушку, так и, наконец, блокировки, блок подъема должен быть размещен после блока TRY.
3) Блок подъема связан с типом соответствующего класса исключений.
4) Попробовать блок может иметь несколько блоков вылова. Если так, то первый соответствующий блок выполняется. То есть виртуальная машина Java соответствует фактическим объектам исключения, с типами исключений, объявленными каждым блоком кода подъема в последовательности. Если объект исключения является типом исключения или экземпляром его подкласса, будет выполнен блок кода подъема, а другой блок кода подъема не будет выполнен.
5) Вложенная структура с финалькой.
6) В структуре FREACH-FINALL может быть повторно перебросить исключение.
7) В дополнение к следующим ситуациям, выполнение окончания окончания: jvm завершается преждевременно (называется System.exit (int)); бросает нездоровое исключение в наконец -то блок; Компьютер включен, уволен или подвергается атакованию вирусом.
4. Орден выполнения попытки, поймать и, наконец, блоки операторов:
1) Когда попытка не поймает исключение: операторы в блоке оператора TRY выполняются один за другим, и программа пропустит блок оператора CACT и выполняет блок оператора и последующими операторами;
2) Когда TRY поймает исключение, блок оператора CATCH не обрабатывает это исключение: когда исключение происходит в операторе в блоке оператора TRY и блоке оператора CACT, который не обрабатывает это исключение, исключение будет доставлено в JVM для обработки, и оператор в блоке оператора, наконец, будет выполнен, но утверждение после того, как блок оператора, окончательно не будет выполнен;
3) Когда попытка поймает исключение, блок оператора Catch будет обрабатывать это исключение: оно выполнено в блоке оператора TRY в порядке. Когда происходит исключение, когда происходит исключение в определенном утверждении, программа перейдет к блоку операторов Catch и сопоставит его один за другим. Найдите соответствующий обработчик. Другие блоки операторов Catch не будут выполнены. В блоке оператора TRY оператор после исключения не будет выполнено. После выполнения блока оператора Catch, оператор в блоке оператора наконец будет выполнен, и, наконец, оператор после выполнения блока оператора наконец -то;
Иллюстрация выполнения Try, Catch и, наконец, блоки операторов:
Рисунок 2 иллюстрирует выполнение Try, Catch и, наконец, блоков операторов
3.2 Выбросьте исключение
Любой код Java может добавлять исключения, такие как: код, написанный вами, код из пакета среды разработки Java или система выполнения Java. Независимо от того, кто это, вы можете бросить исключение через заявление о броске Java. Любое исключение, выброшенное из метода, должно использоваться с пунктом бросков.
1. Броски бросают исключение
Если метод может иметь исключение, но не имеет возможности обрабатывать такое исключение, вы можете использовать пункт о бросках, чтобы объявить об исключении, которое принесло исключение при объявлении метода. Например, автомобиль может потерпеть неудачу при запуске, и сам автомобиль не может справиться с этим сбоем, поэтому позвольте водителю справиться с ним.
Оператор бросков используется, чтобы объявить тип исключения, чтобы бросить при определении метода. Если тип исключения исключений брошен, метод объявляется, чтобы бросить все исключения. Несколько исключений можно разделить с помощью запятых. Формат синтаксиса оператора бросков:
MethodName Throws Exception1, Exception2, .., ExceptionN {} бросает после названия метода Exception1, Exception2, ..., ExceptionN - это список исключений, которые должны быть брошены. Когда метод отбрасывает список исключений исключений, метод не будет обрабатывать исключения этих типов и их типов подкласса, но будет брошен на метод, который вызывает метод и будет обрабатываться им. Например:
импортировать java.lang.xpress; public class testexception {static void pop () отрицает негативное значение {// определить метод и выбрасывать исключение негативного диапазона int [] arr = new int [-3]; // Создать массив} public static void main (string [] args) {// Основной метод try {// try оператор обрабатывает информацию об исключении pop (); // Вызов метода pop ()} catch (negativearraysizexection e) {system.out.println ("Исключение, брошенное методом pop ()"); // Вывод информация об исключении}}}После того, как вы бросили исключение из вызывающего абонента, используя ключевое слово Throws, если вызывающий абонент не хочет обрабатывать исключение, вы можете продолжать его бросить, но в конце концов должен быть вызывающий абонент, который может справиться с исключением.
Метод POP не обрабатывает исключение OntiveAgraySizexexception, но обрабатывается основной функцией.
Правило бросков, чтобы бросить исключения:
1) Если это не контролируемое исключение, то есть ошибку, Runtimeexception или их подклассы, вы можете объявить исключение, которое будет выброшено без использования ключевого слова Throws, и компиляция все равно будет проходить плавно, но оно будет брошено системой во время выполнения.
2) должны быть объявлены любые проверенные исключения, которые могут быть выброшены методом. То есть, если метод может иметь проверенное исключение, он будет пойман либо с оператором Try-Catch, либо бросьте его с объявлением пункта о бросках, в противном случае он вызовет ошибку компиляции.
3) Только при брошении на исключение, вызывающий абонент метода должен обрабатывать или пересмотреть исключение. Когда вызывающий метод не может справиться с исключением, он должен продолжать бросать его вместо того, чтобы глотать его целиком.
4) Вызовный метод должен следовать любым проверенным правилам обработки исключений и объявления. Если метод перезаписан, исключения, которые отличаются от перезаписного метода, не могут быть объявлены. Любое объявленное исключение должно быть аналогичным или подклассом исключения, объявленного переопределенным методом.
Например:
void method1 () бросает ioexception {} // Legal // ошибка компиляции, ioException должно быть пойман или объявлено, чтобы выбрать void method2 () {method1 (); } // Legal, объявить, что выбросить ioException void method3 () бросает ioException {method1 (); } // Legal, объявить об исключении, ioException - это подкласс Exception void method4 (), который вызывает исключение {method1 (); } // Legal, захватить ioException void method5 () {try {method1 (); } catch (ioException e) {…}} // Ошибка компиляции, вы должны поймать или объявить, что выброшенное исключение method6 () {try {method1 (); } catch (ioException e) {throw neval Exception ();}} // Legal, объявить исключение Thress void Method7 () Throws Exception {try {method1 (); } catch (ioException e) {бросить новое exection ();}} Основа для определения того, что исключение может произойти в методе, заключается в следующем:
1) В методе есть оператор. Например, блок кода подъема приведенного выше метода Method7 () имеет оператор THR.
2) Другие методы называются, и другие методы используют пункт Throws, чтобы объявить какое -то исключение, чтобы бросить. Например, метод Method3 () вызывает метод Method1 (), а метод Method1 () заявляет, что выброшено ioException, поэтому в методе Method3 () может возникнуть ioException.
2. Используйте бросок, чтобы бросить исключение
Брось всегда появляется в корпусе функции и используется, чтобы бросить исключение из броска типа. Программа прекратится сразу после оператора Thr, оператор после ее нельзя выполнить, а затем во всех блоках TRY, содержащих его (возможно, в функции вызова верхнего уровня) ищут блоки Try, содержащие пункт о ущербе, который соответствует его изнутри.
Мы знаем, что исключениями являются объекты Extance Exception Class, и мы можем создать объекты Encement Exception Class, которые будут выдвинуты с помощью оператора Thr. Синтаксический формат этого утверждения:
бросить новое исключение;
Например, бросьте объект исключения класса IOException:
бросить новое ioException;
Следует отметить, что бросает только объекты экземпляров, которые могут бросать класс, бросаемые или подклассы. Следующая операция неверна:
бросить новую строку ("Исключение");Это потому, что строка не является подклассом брошенного класса.
Если исключение проверки выброшено, вы также должны объявить тип исключения, который метод может добавить в заголовке метода. Вызывающий абонент этого метода также должен проверить для обработки исключения брошенного.
Если все методы бросают полученный слой исключений по слою, JVM в конечном итоге обработает его, а обработка также очень проста, которая предназначена для печати сообщений исключений и стека. Если ошибка или Runtimeexception выбрасывается, у вызывающего вызов метода есть возможность обрабатывать исключение.
Пакет -тест; импортировать java.lang.xpress; public class testexception {static int Covertient (int x, int y) бросает myexception {// определить метод, чтобы добавить исключение, если (y <0) {// определить, является ли параметр меньше 0, бросает новое Myexception («Раздел не может быть отрицательным числом»); // Информация об исключении} возвращает x/y; // возвращаемое значение} public static void main (String args []) {// Основной метод int a = 3; int b = 0; try {// try оператор содержит утверждения, которые могут иметь исключения int result = cotitient (a, b); // метод вызова QuoteEnt ()} Catch (myException e) {// Обработка пользовательской системы исключений. // Информация об исключении вывода} catch (arithmeticexception e) {// Обработка Arithmeticexception System.out.println ("Divorceipt не может быть 0"); // Вывод информации о приглашении} catch (Exception e) {// Обработка других исключений System.out.println («Другие исключения произошли в программе»); // Вывод информация о приглашении}}} класс myexception Extends Exception {// Создание пользовательского исключения класса строки строки; // Определить переменную типа строки public myexception (string errormessagr) {// method method method message = errormessagr; } public String getMessage () {// переопределить метод getMessage () возвращается сообщение; }}3.3 цепочка исключений
1) Если будет вызван коэффициент (3, -1), произойдет исключение Myexception, и программа будет перенесена в кодовый блок Catch Exception E) для выполнения;
2) Если называется коэффициент (5,0), исключение Arithmeticexception будет повышено из -за ошибки «Разделяет 0». Он принадлежит к классу исключений выполнения и автоматически брошен системой времени выполнения Java. Метод COTITIONT () не ловит исключение Arithmeticexception. Система времени выполнения Java будет искать основной метод вдоль стека вызовов метода и загрузить исключение, которое вызывает вызывник метода COTITIONT ():
int result = covertient (a, b); // Call Method Covert ()
Поскольку это утверждение находится в области мониторинга попытки, арифметикексация с «разделителем - 0», передано системой времени выполнения Java и соответствует пункту «Уловка»:
catch (arithmeticexception e) {// обрабатывать arithmeticexception system.out.println («Раздел не может быть 0»); // Вывод информации} Информация}Результатом обработки является то, что выход «разделитель не может быть 0». Java, механизм обработки, который передает информацию о исключении вверх, образует цепочку исключений.
Проверка исключения, брошенное методом Java, будет передано в метод вызова с возможностью обработки, основанной на стеке вызовов и вдоль иерархии вызова метода, а самый высокий уровень будет до основного метода. Если исключение передается в основной метод, но у основного нет возможности обрабатывать его и не бросает исключение через объявление бросков, может возникнуть ошибка компиляции.
3) Если возникают другие исключения, пойман (исключение E) будет использоваться для ловушки. Since Exception is the parent class of all exception classes, if the catch (Exception e) code block is placed in front of the other two code blocks, the subsequent code blocks will never be executed, which makes no sense, so the order of catch statements cannot be replaced.
3.4 Throwable类中的常用方法
注意:catch关键字后面括号中的Exception类型的参数e。Exception就是try代码块传递给catch代码块的变量类型,e就是变量名。catch代码块中语句"e.getMessage();"用于输出错误性质。通常异常处理常用3个函数来获取异常的有关信息:
getCause():返回抛出异常的原因。如果cause 不存在或未知,则返回null。
getMeage():返回异常的消息信息。
printStackTrace():对象的堆栈跟踪输出至错误输出流,作为字段System.err 的值。
有时为了简单会忽略掉catch语句后的代码,这样try-catch语句就成了一种摆设,一旦程序在运行过程中出现了异常,就会忽略处理异常,而错误发生的原因很难查找。
5.Java常见异常
在Java中提供了一些异常用来描述经常发生的错误,对于这些异常,有的需要程序员进行捕获处理或声明抛出,有的是由Java虚拟机自动进行捕获处理。Java中常见的异常类:
1. runtimeException子类:
1、 java.lang.ArrayIndexOutOfBoundsException
数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
2、java.lang.ArithmeticException
算术条件异常。譬如:整数除零等。
3、java.lang.NullPointerException
空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
4、java.lang.ClassNotFoundException
找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
5、java.lang.NegativeArraySizeException 数组长度为负异常
6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
7、java.lang.SecurityException 安全性异常
8、java.lang.IllegalArgumentException 非法参数异常
2.IOException
IOException:操作输入流和输出流时可能出现的异常。
EOFException 文件已结束异常
FileNotFoundException 文件未找到异常
3. 其他
ClassCastException 类型转换异常类
ArrayStoreException 数组中包含不兼容的值抛出的异常
SQLException 操作数据库异常类
NoSuchFieldException 字段未找到异常
NoSuchMethodException 方法未找到抛出的异常
NumberFormatException 字符串转换为数字抛出的异常
StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常
IllegalAccessException 不允许访问某类异常
InstantiationException 当应用程序试图使用Class类中的newInstance()方法创建一个类的实例,而指定的类对象无法被实例化时,抛出该异常
6.自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可。
在程序中使用自定义异常类,大体可分为以下几个步骤。
(1)创建自定义异常类。
(2)在方法中通过throw关键字抛出异常对象。
(3)如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
(4)在出现异常方法的调用者中捕获并处理异常。
在上面的“使用throw抛出异常”例子已经提到了。
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.