На языке Java базовым классом класса ошибок является java.lang.error, а базовым классом класса исключений является java.lang.exception.
1) Сходства: java.lang.error и java.lang.xception являются подклассами java.lang.lowable, так что java.lang.error и java.lang.xception сами и их подклассы могут использоваться как объекты броска, такие как: бросить новый myerror (); и бросить новое myexception (); Где класс Myerror является подклассом java.lang.error, а класс Myexception - это подкласс java.lang.xpression.
2) Различия: Java.lang.error Сам и его подклассы не требуют поддержки оператора Try-Catch. Метод может быть возвращен в любое время, как определено следующим методом:
public String mymethod () {бросить новый myerror (); } Где класс Myerror является подклассом класса java.lang.error.
Java.lang.Exception сами и его подклассы нуждаются в поддержке операторов Try-Catch, и следующее определение метода неверно:
public String mymethod () {бросить новый myexception (); }Правильный метод определяется следующим образом:
public String mymethod () бросает myexception {бросить новое myexception (); }Где класс MyException является подклассом java.lang.exception.
Исключение Java - это объект, созданный, когда возникает ненормальная ситуация, когда работает программа Java. Он инкапсулирует информацию об исключении. Корневой класс исключения Java - java.lang.lowable. Весь класс имеет два прямых подкласса java.lang.error и java.lang.exception.error - серьезная ошибка, которая не может быть восстановлена самой программой. Исключение указывает на ошибку исключения, которая может быть поймана и обработана программой. JVM использует стек вызовов метода для отслеживания ряда процессов вызова метода в каждом потоке, который сохраняет локальную информацию каждого метода вызова. Для независимых Java -программ это может вплоть до основного метода программы. Когда вызывается новый метод, JVM помещает структуру стека, описывающую метод в верхней части стека, а метод в верхней части стека является правильным методом выполнения. Когда j после того, как метод AVA выполняется нормально, JVM возвращается в структуру стека метода из стека вызовов, а затем продолжает обрабатывать предыдущий метод. Если метод Java бросает исключение во время выполнения кода, JVM должен найти код блока захвата, который может завоевать исключение. Сначала он проверяет, имеет ли текущий метод такой блок кода подъема, и, если он существует, выполните блок кода подъема. В противном случае JVM возвращается к структуре стека метода в стеке вызовов и продолжает находить соответствующий блок кода подъема в предыдущем методе. Наконец, если JVM преследует метод Main (), то есть он продолжает бросать исключение из метода Main () и все еще не обнаружил блок кода для обработчика исключений, поток будет прекращать ненормально. Если поток является основным потоком, приложение также завершится соответственно. В настоящее время JVM будет бросить исключение непосредственно пользователю, и оригинальная информация об исключении будет показана на терминале пользователя.
Java.lang.browable Исходной код
Пакет java.lang; импортировать java.io.*; / ** * * * /*** Настоящий код сохраняет некоторую индикацию обратной марки стека в этом слоте. */ частный переходный объект Backtrace; / *** Информация, описывающая это исключение*/ private String Defitmessage; / *** Указывает, что текущее исключение вызвано бросаемым*, если NULL означает, что исключение не вызвано другим бросаемым*, если этот объект такой же, как и он сам, это указывает на то, что объект, вызывающий исключение, не было инициализировано*/ Private Throwable Cause = This; / *** Массив, описывающий трек исключения*/ private stacktraceElement [] stacktrace; / *** Конструктор, объект причины не инициализируется, может быть инициализирован в будущем, используя initCause* FilinStackTrace может использоваться для инициализации массива его треков исключений*/ public throwable () {filinStackTrace (); } /*** Constructor* /public Throwable (String Message) {// Заполнить массив треков исключений FilinStackTrace (); // Инициализировать исключение Описание Информация Подробности message = сообщение; } / *** Конструктор, причина представляет объект причины* / public throwable (строковое сообщение, бросаемое причина) {filinstacktrace (); DetailMessage = сообщение; this.cause = причина; } / *** Конструктор* / public throwable (throwable disee) {filinstacktrace (); DetailMessage = (причина == null? null: canes.toString ()); this.cause = причина; } / *** Получить подробную информацию* / public String getMessage () {return DeplicEdMessage; } / *** Получить подробную информацию* / public String getLocalizedMessage () {return getMessage (); } / *** Получить объект причины* / public throwable getCause () {return (canes == this? Null: canie); } /*** Инициализируйте объект причины. Этот метод может быть вызван только один раз без инициализации*/ public synchronized throwable initCause (Throwable Cause) {// Если оно не является ненициализированным состоянием, добавьте исключение, если (это. Кауза! // объект причины, который должен быть установлен, одинаково сам по себе и бросает исключение, если (причина == это) бросьте новое allosalargumentException («самооплата не разрешено»); // Установите объект причины this.cause = причина; // вернуть объект SET CAUSE вернуть это; } / *** String представление* / public String toString () {string s = getClass (). GetName (); String Message = getLocalizedMessage (); вернуть (сообщение! = NULL)? (s + ":" + сообщение): s; } / **. } /**. // Получить массив треков исключений stacktraceElement [] trace = getourStackTrace (); // Распечатать строковое представление каждого элемента для (int i = 0; i <trace.length; i ++) s.println ("/tat"+trace [i]); // Получить причину объект, бросая eurscause = getCause (); // рекурсивно распечатать информацию объекта причины, если (ourcause! = Null) ourcause.printstacktraceascause (s, trace); }} /**. // M является последним элементом текущего массива треков исключений, // n является последним элементом массива треков исключений исключения, вызванного текущим объектом int m = trace.length-1, n = caneventrace.length-1; // петля из -за двух массивов соответственно. Если это равно, цикл до тех пор, пока неравенство или массив не достигнет начала while (m> = 0 && n> = 0 && trace [m] .equals (cudeTrace [n])) {m--; n--; } // Тот же номер int framesincommon = trace.length - 1 - m; // Распечатать разные следы ошибки s.println ("вызван:" + это); for (int i = 0; i <= m; i ++) s.println ("/tat"+trace [i]); // Если есть одинаковое число, распечатайте тот же номер, если (Framesincommon! = 0) S.Println ("/T ..." + FramesIncommon + "More"); // Получить причину этого объекта и распечатать информацию рекурсивно выбрасываемой ourcause = getCause (); if (eurcause! = null) ourcause.printstacktraceascause (s, trace); } / **. StacktraceElement [] trace = getourStackTrace (); for (int i = 0; i <trace.length; i ++) s.println ("/tat"+trace [i]); Выбрать urscause = getCause (); if (eurcause! = null) ourcause.printstacktraceascause (s, trace); }} / *** Распечатать информацию об объекте причины* / private void printStackTraceasCause (printWriter S, stackTraceElement [] CudeTrace) {// Assert Thread.holdSlock (s); // Вычислить количество общих кадров между этим и вызвало StackTraceElement [] trace = getourStackTrace (); int m = trace.length-1, n = caneventrace.length-1; while (m> = 0 && n> = 0 && trace [m] .equals (cudeTrace [n])) {m--; n--; } int framesincommon = trace.length - 1 - m; s.println («вызван:» + это); for (int i = 0; i <= m; i ++) s.println ("/tat"+trace [i]); if (framesincommon! = 0) s.println ("/t ..." + framesincommon + "больше"); // заканчиваться, если у нас есть причина, бросая wreecauses = getCause (); if (eurcause! = null) ourcause.printstacktraceascause (s, trace); } / *** Заполните трек исключения* / public Synchronized Native Throwable FillinStackTrace (); / *** Возвращает копию текущего трека исключения*/ public StackTraceElement [] getStackTrace () {return (stackTraceElement []) getOurStackTrace (). Clone (); } /** * Получить текущий трек исключения * /private Synchronized StackTraceElement [] getOurStackTrace () {// Если этот метод вызывает в первый раз, массив треков исключений инициализируется if (stackTrace == null) {// Получить глубину дорожки исключения int debul = getStackTepTh (); // Создать новый массив треков исключений и заполнить его stacktrace = new StackTraceElement [Dexit]; для (int i = 0; i <debin; i ++) stacktrace [i] = getStackTraceElement (i); // Получить трек исключения указанной битовой точки} return stacktrace; } /*** Установить трек исключения* /public void setStackTrace (stackTraceElement [] stackTrace) {// Копировать параметр параметра stacktraceElement [] defendensivecopy = (stacktraceelement []) stacktrace.clone (); // Если параметр настройки имеет пустые элементы, будет выбрано исключение (int i = 0; i <defensivecopy.length; i ++) if (defensivecopy [i] == null) бросить новый NullpointerException ("stacktrace [" + i + "]"); // Установить трек исключения текущего объекта this.stacktrace = defensivecopy; } / ** * Глубина трека исключения, 0 означает, что невозможно получить * / Private Native int getStackTracedEpth (); / *** Получить отслеживание исключения указанной битовой точки*/ private native stacktraceElement getStackTraceElement (int index); Частный синхронизированный void writeBject (java.io.objectOutputStream s) бросает ioException {getOurStackTrace (); S.DefaultWriteObject (); }}