Предисловие
В процессе изучения Java, я считаю, что все узнали главу об исключениях, и я не буду говорить о основных характеристиках и использовании исключений здесь. Что такое исключение? Я не знаю, как все это понимают. Насколько я понимаю, очень просто, то есть ненормальные ситуации. Например, сейчас я мужчина, но у меня есть что -то уникальное для женщин. На мой взгляд, это определенно ненормальность, и я не могу ее вынести. Я считаю, что каждый может понять и использовать его правильно.
Однако, если обработка и использование оптических основных исключений недостаточны, в работе нет страшно. Иногда необходимо использовать исключения для управления обработкой бизнеса. Например: при использовании базы данных с уникальными ограничениями, если вставлены дубликаты данных, ее можно обработать, захватывая уникальное исключение ограничения DuplicateKeyException. В настоящее время соответствующее состояние может быть брошено на вызову на уровне сервера, а верхний слой будет обрабатывать его в соответствии с соответствующим состоянием. Поэтому иногда исключения являются методом вождения для бизнеса.
Некоторые люди выведут исключение после того, как поймают исключение. Интересно, что осторожные студенты что -то заметили. Что такое выходное исключение?
Вот общее исключение:
java.lang.arithmeticexception: / by Zero at Greenhouse.exceptionTest.testexception (exceptionTest.java:16) на sun.reflect.nativemethodaccessorimpl.invoke0 (нативный метод) на sun.reflect.nativemethodaccessorimpl.invoke (nativemethodaccesspormplecpormplecspormple. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.reflectivecallable.run (ReflectiveCallable.java:15) на org.junit.runners.model.frameworkmethod.invokeexplospolosives org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) на org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:50) по адресу org.junit.runners.parentrunner $ 3.run (parentrunner.java:193) at org.juniter.runners.parentrunner $ 1.schedule (gainrunnnernnner.javnnnernner.javnnnernner.javnnnernner (gary.javnnernner.javnnnerner. org.junit.runners.parentrunner.runchildren (parentrunner.java:191) на org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) на org.junit.runners.parentrunner $ 2.Evaluate (parentrunner.java:184). org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.junit.runner.JUnitCore.run(JUnitCore.java:157) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.ideatestrunner $ repeater.startrunnerwithargs (ideatestrunner.java:47) на com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart (junitstarter.java:242) com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Исключение Null Pointer:
java.lang.nullpointerexception at Greenhous sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.reflectivecallable.run (ReflectiveCallable.java:15) на org.junit.runners.model.frameworkmethod.invokeexplospolosives org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) на org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:76) org.junit.runners.blockjunit4classrunner.runchild (blockjunit4classrunner.java:50) по адресу org.junit.runners.parentrunner $ 3.run (parentrunner.java:193) at org.juniter.runners.parentrunner $ 1.schedule (gainrunnnernnner.javnnnernner.javnnnernner.javnnnernner (gary.javnnernner.javnnnerner. org.junit.runners.parentrunner.runchildren (parentrunner.java:191) на org.junit.runners.parentrunner.access $ 000 (parentrunner.java:42) на org.junit.runners.parentrunner $ 2.Evaluate (parentrunner.java:184). org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.junit.runner.JUnitCore.run(JUnitCore.java:157) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.ideatestrunner $ repeater.startrunnerwithargs (ideatestrunner.java:47) на com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart (junitstarter.java:242) com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Вы нашли функцию, что вывод исключения - это место, где исключение происходит точно, и много вызовов процесса выполнения распечатаны позже. Откуда эта информация? Эта информация получена из стека. При печати журнала исключений эта информация о вызове будет получена из стека. Конечно, полезно иметь возможность точно найти исключения, но иногда, когда мы рассматриваем производительность программы и некоторых требований, нам иногда не нужно полностью печатать эту информацию и получать соответствующую информацию из стека вызовов метода, который является потреблением производительности. Для некоторых программ с высокоэффективными требованиями мы можем полностью улучшить эффективность программы в этом аспекте.
Итак, как избежать вывода этой информации о стеке? Тогда пользовательские исключения могут решить эту проблему:
Во -первых, автоматическое исключение должно наследовать Runtimeexception, а затем переписать метод FillinstackTrace и ToString. Например, я определяю исключение AppException ниже:
пакет com.green.monitor.common.exception; import java.text.messageformat;/*** Custom Exception Class*/public Class Appexception Extends runtimeexception {private boolean issuccess = false; частный ключ строки; Информация о приватной строке; public AppException (String Key) {super (Key); this.key = key; this.info = key; } public appException (String Key, String Message) {super (messageFormat.format ("{0} [{1}]", Key, Message)); this.key = key; this.info = сообщение; } public appException (строковое сообщение, String Key, String Info) {super (сообщение); this.key = key; this.info = info; } public boolean issuccess () {return issuccess; } public String getKey () {return Key; } public void setKey (String Key) {this.key = key; } public String getInfo () {return info; } public void setInfo (string info) {this.info = info; } @Override public throwable filinstacktrace () {return this; } @Override public String toString () {return messageformat.format ("{0} [{1}]", this.key, this.info); }}Так зачем переписать FillinStackTrace и методы ToString? Давайте сначала посмотрим, что такое исходный код.
Public Class Runtimeexception расширяет Exception {Static Final Long SerialVersionuid = -7034897190745766939L; /** Создает новое исключение времени выполнения с помощью <code> null </code> в качестве* подробного сообщения. Причина не инициализируется и впоследствии может быть * инициализирована вызовом {@link #initcause}. */ public runtimeexception () {super (); } /** Создает новое исключение времени выполнения с указанным подробным сообщением. * Причина не инициализируется и может быть инициализирована вызовом * {@link #initcause}. * * @param Сообщение о подробном сообщении. Подробное сообщение сохраняется для * более позднего поиска методом {@link #getMessage ()}. */ public runtimeexception (строковое сообщение) {super (сообщение); } /** * Создает новое исключение времени выполнения с указанным подробным сообщением и * причиной. <p> Обратите внимание, что подробное сообщение, связанное с * <code> причиной </code>, - это <i> не </i> автоматически включено в * Сообщение об этом исключении выполнения. * * @param Сообщение о подробном сообщении (которое сохраняется для последующего поиска * методом {@link #getmessage ()}). * @param Причина причины (которая сохраняется для последующего поиска методом * {@link #getCause ()}). (A <tt> null </ tt> значение * разрешено, и указывает, что причина не существует или * неизвестна.) * @Since 1.4 */ public runtimeexception (строковое сообщение, бросаемое причина) {super (сообщение, причина); }/** Конструирует новое исключение среды выполнения с указанной причиной и * Подробное сообщение <TT> (причина == NULL? NULL: CAUSE.TOSTRING ()) </TT> * (который обычно содержит класс и подробное сообщение * <TT> CAUSE </TT>). Этот конструктор полезен для исключений во время выполнения *, которые немного больше, чем обертки для других бросков. * * @param Причина причины (которая сохраняется для последующего поиска методом * {@link #getCause ()}). (A <tt> null </ tt> значение * разрешено и указывает, что причина не существует или * неизвестна.) * @Since 1.4 */ public runtimeexception (причина бросаемой) {super (canes); }}Runtimeexception наследует исключение, но оно только вызывает метод родительского класса и не выполняет никаких других операций. Итак, давайте продолжим посмотреть, что происходит в исключении?
Исключение открытого класса Extends Throwable {Static Final Long Serialversionuid = -3387516993124229948L; /*** Создает новое исключение с <code> null </code> в качестве подробного сообщения. * Причина не инициализируется и впоследствии может быть инициализирована вызовом * {@link #initcause}. */ public Exception () {super (); } /*** Создает новое исключение с указанным подробным сообщением. Причина * не инициализируется и впоследствии может быть инициализирована * вызовом {@link #initcause}. * * @param Сообщение о подробном сообщении. Подробное сообщение сохраняется для * более позднего поиска методом {@link #getMessage ()}. */ public Exception (String Message) {super (сообщение); } /** * Создает новое исключение с указанным подробным сообщением и * причиной. <p> Обратите внимание, что подробное сообщение, связанное с * <code> причиной </code>, - это <i> не </i> автоматически включено в * Подробное сообщение этого исключения. * * @param Сообщение о подробном сообщении (которое сохраняется для последующего поиска * методом {@link #getmessage ()}). * @param Причина причины (которая сохраняется для последующего поиска методом * {@link #getCause ()}). (A <tt> null </ tt> значение * разрешено, и указывает, что причина не существует или * неизвестна.) * @Since 1.4 */ public exception (строковое сообщение, причина бросания) {super (сообщение, причина); }/** * Конструирует новое исключение с указанной причиной и детализацией * Сообщение <TT> (причина == NULL? NULL: CAUSE.TOSTRING ()) </TT> (который * обычно содержит класс и подробное сообщение <TT> CAUSE </TT>). * Этот конструктор полезен для исключений, которые чуть больше, чем * обертки для других бросков (например, {@link * java.security.privilegedactionException}). * * @param Причина причины (которая сохраняется для последующего поиска методом * {@link #getCause ()}). (A <tt> null </ tt> значение * разрешено, и указывает, что причина не существует или * неизвестна.) * @Since 1.4 */ public exception (бросаемая причина) {super (canie); }}Как видно из исходного кода, метод родительского класса также называется непосредственно в исключении. Как Runtimeexception, я на самом деле ничего не сделал. Итак, давайте посмотрим на то, что происходит в броске:
Общедоступный класс. DetailMessage = сообщение; } /*** Заполняет трассировку стека выполнения. Этот метод записывает в этом * <code> Throwable </code> Информация о объекте о текущем состоянии * кадров стека для текущего потока. * * @return Ссылка на этот <code> throwable </code> экземпляр. * @see java.lang.throwable#printstacktrace () */ public synchronized Native Throwable filinstackTrace (); /** * Обеспечивает доступ к программированию к информации о трассировке стека, напечатанной * {@link #printstacktrace ()}. Возвращает массив элементов трассировки стека, * каждый представляет одну кадр стека. Элемент нулевого массива * (при условии, что длина массива не нулевая) представляет верхнюю часть * стека, которая является последним вызовом метода в последовательности. Как правило, * это точка, в которой этот бросок был создан и брошен. * Последний элемент массива (при условии, что длина массива не нулевой) * представляет нижнюю часть стека, которая является первым вызовами методом * в последовательности. * * <p> Некоторые виртуальные машины могут при некоторых обстоятельствах опустить один * или несколько кадров стека из трассировки стека. В крайнем случае * виртуальная машина, которая не имеет информации о трассировке стека, касающейся * этой бросаемой, разрешается возвращать массив нулевой длины из этого * метода. Вообще говоря, массив, возвращаемый этим методом, будет содержать один элемент для каждого кадра, который будет напечатан * <tt> printStackTrace </tt>. * * @return Массив элементов трассировки стека, представляющих трассировку стека *, относящиеся к этому бросанию. * @Since 1.4 */ public StackTraceElement [] getStackTrace () {return (stackTraceElement []) getOurStackTrace (). Clone (); } private Synchronized StackTraceElement [] getOurStackTrace () {// Инициализировать трассировку стека, если это первый вызов этого метода if (stacktrace == null) {int debul = getStackTracedEpth (); stacktrace = new StackTraceElement [глубина]; для (int i = 0; i <глубина; i ++) stacktrace [i] = getStackTraceElement (i); } return stacktrace; } /** * Возвращает количество элементов в трассировке стека (или 0, если стек * трассировка недоступна). * * Защита пакета для использования с помощью SharedSecrets. */ Native int getStackTracedEpth (); /*** Возвращает указанный элемент трассировки стека. * * Защита пакета для использования с помощью SharedSecrets. * * @param Индекс индекса элемента для возврата. * @Throws IndexoutOfBoundSexception If <Tt> index <0 || * index> = getStackTracedEpth () </ tt> */ Настоящий StackTraceElement getStackTraceElement (int index); /*** Возвращает краткое описание этого броска. * Результатом является конкатенация: * <ul> * <li> {@linkplain class #getName () name} класса этого объекта * <li> ":" (толстая кишка и пространство) * <li> Результат вызова этого объекта {@link #getlocalizedmessage} * </ul> * если <tt> getLocalicAsage} * </ul> * if> getLocalizedmessage} * </ul> *. <tt> null </tt>, тогда просто * Имя класса возвращается. * * @return. Струнное представление этого броска. */ public String toString () {string s = getClass (). getName (); String Message = getLocalizedMessage (); вернуть (сообщение! = NULL)? (s + ":" + сообщение): s; }Из исходного кода это почти более чем на конец броски. Метод FillinStackTrace () является собственным методом. Этот метод будет вызывать базовый язык C, вернуть бросаемый объект, метод ToString и возвращает краткое описание броски. В методе GetStackTrace и GetourStackTrace вызывается нативный метод GetStackTraceElement. Этот метод возвращает указанную информацию элемента стека, поэтому этот процесс должен потреблять производительность. Затем мы можем переписать метод ToString и метод FilinStackTrace в пользовательских исключениях и выводить его непосредственно, не получая информацию о исключении из стека. Это относительно не так «тяжелый» для системы и программы, и это очень хороший способ оптимизировать производительность. Итак, как это выглядит, если происходит пользовательское исключение? Пожалуйста, смотрите ниже:
@Test public void testexception () {try {string str = null; System.out.println (str.charat (0)); } catch (Exception e) {Throw New AppException ("000001", "null Pointer Exception"); }}Затем, когда исключение является ненормальным, система напечатает нашу индивидуальную информацию об исключении:
000001 [null pointer exception] Процесс завершен с кодом выхода -1
Таким образом, это особенно кратко и оптимизирует производительность системной программы, что делает программу менее «тяжелой», поэтому требуется система с особыми требованиями к производительности. Спешите и настройте свое исключение!
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.