Vorwort
Ich glaube, dass jeder das Kapitel über Ausnahmen gelernt hat, und ich werde nicht über die grundlegenden Merkmale und die Verwendung von Ausnahmen hier sprechen. Was ist eine Ausnahme? Ich weiß nicht, wie jeder es versteht. Mein Verständnis ist sehr einfach, dh abnormale Situationen. Zum Beispiel bin ich jetzt ein Mann, aber ich habe etwas Einzigartiges für Frauen. Meiner Meinung nach ist dies definitiv eine Abnormalität und ich kann sie nicht ertragen. Ich glaube, jeder kann es richtig verstehen und richtig benutzen.
Wenn jedoch die optische grundlegende Ausnahmebereichung und -nutzung unzureichend ist, ist es nicht beängstigend, bei der Arbeit aufzutreten. Manchmal ist es notwendig, Ausnahmen zu verwenden, um die Verarbeitung des Geschäfts voranzutreiben. Beispielsweise: Wenn eine Datenbank mit eindeutigen Einschränkungen verwendet wird, kann sie verarbeitet werden, indem ein doppelter Daten eingesetzt wird, indem die eindeutige Einschränkung der DuplikatEkeyException erfasst wird. Zu diesem Zeitpunkt kann der entsprechende Zustand in die aufrufende Ebene in der Serverschicht geworfen werden, und die obere Ebene verarbeitet ihn nach dem entsprechenden Zustand. Manchmal sind Ausnahmen manchmal eine Fahrmethode für das Geschäft.
Einige Leute werden die Ausnahme ausgeben, nachdem sie die Ausnahme erwischt haben. Ich frage mich, ob sorgfältige Schüler etwas bemerkt haben. Was ist die Ausnahmeausnahme?
Hier ist eine häufige Ausnahme:
java.lang.arithmexception: / von Null bei Greenhouse.ExceptionTest.TestException (exceptionTest.java:16) at sun.reflect.nativemethodaccessorimpl.invoke0 (native Methode) bei sun.reflect.nativemethodaccessorimpl.invoke (NATIVEMETHOCT. JAVAICACCESSORMPL.INVOCK (NATIVEMETHOCTION) (NATIVEMETHOCT.NATICACCESSORMPL. (NATIVEMETHET) (NATIVEMETHOCT. sun.reflect.delegatingMethodaccessorimpl.invoke (DelegatingMethodaccessorimpl.java:25) bei Java.lang.reflect.method.invoke (methody.java:597) at org.junit.runners.model.FrameMethodmethodmethod $ 1.runrefectiveCall (RAGEMETRAUS.FRAME. bei org.junit.internal.runners.model.reflectiveCallable.run (reflectiveCallable.java:15) unter org.junit.runners.model org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) bei org.junit.runners.blockJunit4ClasRunner.Runchild (BlockJunit4Classrunner.java:76) at runchild (blockjunit4classrunner.java:76) at terrunner. org.junit.runners.blockJunit4ClassRunner.Runchild (BlockJunit4ClassRunner.java:50) bei org.junit.runners.parentrunner $ 3.run (parentunner.java:193) at org.junit.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.Runnern. -Parentrun -$ -S -$ -S -$ -S -$ -S -$ -S -$). org.junit.runners.parentrunner.runchildren (parentunner.java:191) at org.junit.runners.Parentrunner.access $ 000 (parentunner.java:42) bei org.junit.runners.Parentunner $ 2.Valuster (Parentunner. parentuner.java org.junit.runners.parentrunner.run (parentunner.java:236) bei org.junit.runner.junitcore.run (junitcore.java:157) auf com.intellij.junit4.junit4Ideatestrunner.startrunner bei com.intellij.rt.execution.junit.ideatestrunner $ repeater.startrunnerwithargs (ideatestrunner.java:47) unter com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart (junitstarter.java:242) at com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Eine Nullzeiger -Ausnahme:
java.lang.NullPointerException at greenhouse.ExceptionTest.testException(ExceptionTest.java:16) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.delegatingMethodaccessorimpl.invoke (DelegatingMethodaccessorimpl.java:25) bei Java.lang.reflect.method.invoke (methody.java:597) at org.junit.runners.model.FrameMethodmethodmethod $ 1.runrefectiveCall (RAGEMETRAUS.FRAME. bei org.junit.internal.runners.model.reflectiveCallable.run (reflectiveCallable.java:15) unter org.junit.runners.model org.junit.internal.runners.statements.invokemethod.evaluate (invokemethod.java:20) bei org.junit.runners.blockJunit4ClasRunner.Runchild (BlockJunit4Classrunner.java:76) at runchild (blockjunit4classrunner.java:76) at terrunner. org.junit.runners.blockJunit4ClassRunner.Runchild (BlockJunit4ClassRunner.java:50) bei org.junit.runners.parentrunner $ 3.run (parentunner.java:193) at org.junit.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.runners.Runnern. -Parentrun -$ -S -$ -S -$ -S -$ -S -$ -S -$). org.junit.runners.parentrunner.runchildren (parentunner.java:191) at org.junit.runners.Parentrunner.access $ 000 (parentunner.java:42) bei org.junit.runners.Parentunner $ 2.Valuster (Parentunner. parentuner.java org.junit.runners.parentrunner.run (parentunner.java:236) bei org.junit.runner.junitcore.run (junitcore.java:157) auf com.intellij.junit4.junit4Ideatestrunner.startrunner bei com.intellij.rt.execution.junit.ideatestrunner $ repeater.startrunnerwithargs (ideatestrunner.java:47) unter com.intellij.rt.execution.junit.junitstarter.preparestreamsandstart (junitstarter.java:242) at com.intellij.rt.execution.junit.junitstarter.main (junitstarter.java:70)
Haben Sie eine Funktion gefunden, dass die Ausgabe der Ausnahme der Ort ist, an dem die Ausnahme genau erfolgt, und viele Ausführungsverfahrensanrufe werden später ausgedruckt. Woher kommen diese Informationen? Diese Informationen werden vom Stapel erhalten. Beim Drucken des Ausnahmeprotokolls werden diese Anrufinformationen aus dem Stapel erhalten. Es ist natürlich gut, Ausnahmen genau zu lokalisieren, aber manchmal müssen wir diese Informationen manchmal nicht vollständig drucken und die entsprechenden Informationen aus dem Methode Call -Stack, der Leistungsverbrauch ist, manchmal nicht vollständig drucken und die entsprechenden Informationen erhalten. Für einige Programme mit hohen Leistungsanforderungen können wir die Programmleistung in diesem Aspekt vollständig verbessern.
Wie kann man diese Stapelinformationen vermeiden? Anschließend können benutzerdefinierte Ausnahmen dieses Problem lösen:
Zuerst muss die automatische Ausnahme die RunTimeException erben und dann die FillinStacktrace- und ToString -Methode neu schreiben. Zum Beispiel definiere ich unten eine AppException -Ausnahme:
Paket com.green.monitor.common.Exception; importieren java.text.messageFormat;/*** Benutzerdefinierte Ausnahmeklasse*/Public Class AppException erweitert RunTimeException {private boolean issuccess = false; privater Stringschlüssel; private Zeichenfolge Info; public AppException (String -Schlüssel) {Super (Schlüssel); this.key = key; this.info = key; } public appException (String -Schlüssel, String -Nachricht) {Super (messageFormat.format ("{0} [{1}]", Schlüssel, Nachricht)); this.key = key; this.info = Nachricht; } public appException (String -Nachricht, String -Schlüssel, String -Info) {Super (meldung); this.key = key; this.info = info; } public boolean issuccess () {return issuccess; } public String getKey () {return key; } public void setKey (String -Schlüssel) {this.key = key; } public String getInfo () {return Info; } public void setInfo (String Info) {this.info = info; } @Override public throwable fillinStacktrace () {return this; } @Override public String toString () {return messageFormat.format ("{0} [{1}]", this.key, this.info); }}Warum also FillinStacktrace und Tastring -Methoden neu schreiben? Schauen wir uns zuerst an, was der Quellcode ist.
öffentliche Klasse RunTimeException erweitert die Ausnahme {statische endgültige lange Serialversionuid = -7034897190745766939L; /** Erstellt eine neue Laufzeitausnahme mit <Code> null </code> als detaillierte Nachricht. Die Ursache wird nicht initialisiert und kann anschließend mit einem Anruf bei {@link #initcause} initialisiert werden. */ public RunTimeException () {Super (); } /** Erstellt eine neue Laufzeitausnahme mit der angegebenen Detailnachricht. * Die Ursache wird nicht initialisiert und kann durch einen * Anruf zu {@link #initcause} initialisiert werden. * * @Param Nachricht die Detailnachricht. Die Detailnachricht wird für * später Abrufen von {@link #getMessage ()} gespeichert. */ public RunTimeException (String -Nachricht) {super (message); } /** * Erstellt eine neue Laufzeitausnahme mit der angegebenen Detailnachricht und * Ursache. <p> Beachten Sie, dass die detaillierte Nachricht, die mit * <Code> zugeordnet ist, </code> <i> nicht </i> automatisch in * in * in dieser Detail -Nachricht dieser Laufzeit integriert ist. * * @param meldung Die Detailnachricht (die zum späteren Abrufen * von {@link #getMessage ()} Methode gespeichert wird). * @Param Ursache die Ursache (die für das spätere Abrufen von * {@link #getCause ()} Methode gespeichert wird). (Ein <tt> null </ tt> Wert ist * zulässig und zeigt an, dass die Ursache nicht existent oder * unbekannt ist.) * @Since 1.4 */ public RunTimeException (String -Nachricht, Throwable Cause) {Super (Nachricht, Ursache); }/** Konstruktionen Eine neue Laufzeitausnahme mit der angegebenen Ursache und einer * Detail -Nachricht von <tt> (cause == null? Null: cause.toString ()) </tt> * (die typischerweise die Klasse und die Detailnachricht von * <tt> cause </tt> enthält). Dieser Konstruktor ist nützlich für Laufzeitausnahmen *, die kaum mehr als Wrapper für andere Fohrings sind. * * @param verursacht die Ursache (die für das spätere Abrufen von * {@link #getCause ()} Methode gespeichert wird). (Ein <tt> null </ tt> Wert ist * zulässig und zeigt an, dass die Ursache nicht existent oder * unbekannt ist.) * @Since 1.4 */ public RunTimeException (throwable Ursache) {Super (Ursache); }}RunTimeException erbt eine Ausnahme, ruft jedoch nur die übergeordnete Klassenmethode auf und führt keine anderen Operationen aus. Lassen Sie uns weiterhin sehen, was in Ausnahme los ist?
Die Ausnahme der öffentlichen Klasse erweitert Throwable. /*** Erstellt eine neue Ausnahme mit <Code> null </code> als Detailnachricht. * Die Ursache wird nicht initialisiert und kann anschließend durch einen * Aufruf zu {@link #initcause} initialisiert werden. */ public exception () {super (); } /*** Erstellt eine neue Ausnahme mit der angegebenen Detailnachricht. Die * Ursache wird nicht initialisiert und kann anschließend durch * einen Aufruf zu {@link #initcause} initialisiert werden. * * @Param Nachricht die Detailnachricht. Die Detailnachricht wird für * später Abrufen von {@link #getMessage ()} gespeichert. */ öffentliche Ausnahme (String -Nachricht) {super (message); } /** * konstruiert eine neue Ausnahme mit der angegebenen Detailnachricht und * Ursache. <p> Beachten Sie, dass die detaillierte Nachricht, die mit * <Code> zugeordnet ist, </code> nicht </i> in * in der Detailnachricht dieser Ausnahme automatisch integriert ist. * * @param meldung Die Detailnachricht (die zum späteren Abrufen * von {@link #getMessage ()} Methode gespeichert wird). * @Param Ursache die Ursache (die für das spätere Abrufen von * {@link #getCause ()} Methode gespeichert wird). (Ein <tt> null </ tt> Wert ist * zulässig und zeigt an, dass die Ursache nicht existent oder * unbekannt ist.) * @Since 1.4 */ öffentliche Ausnahme (String -Nachricht, Wurfweise) {Super (Nachricht, Ursache); }/** * konstruiert eine neue Ausnahme mit der angegebenen Ursache und einer Detail * Meldung von <tt> (cause == null? Null: cause.toString ()) </tt> (was * typischerweise die Klasse und die Detailnachricht von <tt> cause </tt> enthält). * Dieser Konstruktor ist nützlich für Ausnahmen, die kaum mehr als * Wrapper für andere Fohrings sind (z. B. {@link * java.security.privilegedActionException}). * * @param verursacht die Ursache (die für das spätere Abrufen von * {@link #getCause ()} Methode gespeichert wird). (Ein <tt> null </ tt> Wert ist * zulässig und zeigt an, dass die Ursache nicht vorhanden oder * unbekannt ist.) * @Since 1.4 */ öffentliche Ausnahme (Throwable Cause) {Super (Ursache); }}Wie aus dem Quellcode ersichtlich ist, wird die übergeordnete Klassenmethode auch direkt in Ausnahme bezeichnet. Wie RunTimeException habe ich tatsächlich nichts getan. Schauen wir uns also an, was in Throwable vor sich geht:
öffentliche Klasse Throwable Implements Serializable {public Throwable (String Message) {fillInstacktrace (); DetailMessage = Nachricht; } /*** Füllt die Ausführungsstapelspur ein. Diese Methode zeichnet in diesem * <Code> Throwable </code> Objektinformationen zum aktuellen Status der Stapelrahmen für den aktuellen Thread auf. * * @return eine Referenz zu diesem <Code> Throwable </code> Instanz. * @see java.lang.Throwable#printStacktrace () */ public synchronisierte native throwable fillinStacktrace (); /** * Bietet Programmierzugriff auf die von * {@link #printstacktrace ()} gedruckten Stapelverfolgungsinformationen. Gibt eine Reihe von Stapelspurenelementen zurück, die jeweils einen Stapelrahmen darstellen. Das Nuloth-Element des Arrays * (unter der Annahme, dass die Länge des Arrays ungleich Null ist) repräsentiert die Oberseite des * Stacks, die die letzte Methodeaufruf in der Sequenz ist. Typischerweise * Dies ist der Punkt, an dem dieses Throwable erzeugt und geworfen wurde. * Das letzte Element des Arrays (unter der Annahme, dass die Länge des Arrays ungleich Null ist) * repräsentiert den Boden des Stapels, der die erste Methode aufruf * in der Sequenz. * * <p> Einige virtuelle Maschinen können unter bestimmten Umständen einen * oder mehr Stapelrahmen aus der Stapelspur weglassen. Im extremen Fall * kann eine virtuelle Maschine, die keine Stapelverfolgungsinformationen zu * dieses Throwable hat, ein Array mit Null-Länge von dieser * Methode zurückgeben. Im Allgemeinen enthält das von dieser Methode zurückgegebene Array ein Element für jeden Frame, das von * <Tt> printStacktrace </tt> gedruckt wird. * * @return eine Reihe von Stapel -Trace -Elementen, die die Stapelspur darstellen *, die sich auf dieses Throwable beziehen. * @Since 1.4 */ public stacktraceElement [] getStacktrace () {return (stacktraceElement []) getourstacktrace (). clone (); } private synchronisierte stacktraceElement [] getourstacktrace () {// Stack -Trace initialisieren, wenn dies der erste Aufruf dieser Methode ist, wenn (stacktrace == null) {int tiefe = getStacktracePTH (); stacktrace = new StacktraceElement [Tiefe]; für (int i = 0; i <tiefe; i ++) stacktrace [i] = getStacktraceElement (i); } return stacktrace; } /** * Gibt die Anzahl der Elemente in der Stapelspur zurück (oder 0, wenn der Stapel * Trace nicht verfügbar ist). * * Paketschutz für die Verwendung durch SharedSecrets. */ native int getStacktracedepth (); /*** Gibt das angegebene Element der Stapelspur zurück. * * Paketschutz für die Verwendung durch SharedSecrets. * * @param Index des zu zurückgegebenen Elements. * @throw indexoutofBoundSexception if <Tt> Index <0 || * index> = getStacktracedepth () </ tt> */ native stacktraceElement getStackTraceElement (int Index); /*** Gibt eine kurze Beschreibung dieses Throwable zurück. * Das Ergebnis ist die Verkettung von: * <ul> * <li> Die {@linkPlain -Klasse #getName () Name} der Klasse dieses Objekts * <li> ":" (ein Dickdarm und ein Raum) * <li> Das Ergebnis des Aufrufens des Objekts {@link #GetLocalized message} * </ul> * falls ul> * falls ul> * falls <tt> GetLocalizedMessage} methode u. <tt> null </tt>, dann wird der Klassenname zurückgegeben. * * @return eine String -Darstellung dieses Throwable. */ public String toString () {String s = getClass (). getName (); String message = getLocalizedMessage (); return (message! = null)? (s + ":" + meldung): s; }Aus dem Quellcode ist er fast über das Ende des Throwable. Die FillinStacktrace () -Methode ist eine native Methode. Diese Methode ruft die zugrunde liegende C -Sprache auf, gibt ein throwabbares Objekt, eine ToString -Methode zurück und gibt eine kurze Beschreibung des Throwable zurück. In der GetStacktrace -Methode und GetourStacktrace wird die native Methode GetStacktraceElement aufgerufen. Diese Methode gibt die angegebenen Stapelelementinformationen zurück, sodass dieser Vorgang die Leistung konsumieren muss. Anschließend können wir die Methode zur ToString -Methode und die FillInstacktrace -Methode in benutzerdefinierten Ausnahmen umschreiben und sie direkt ausgeben, ohne Ausnahmeinformationen aus dem Stapel zu erhalten. Dies ist relativ nicht so "schwer" für System und Programm und ist eine sehr gute Möglichkeit, die Leistung zu optimieren. Wie sieht es also aus, wenn eine benutzerdefinierte Ausnahme auftritt? Bitte siehe unten:
@Test public void testException () {try {string str = null; System.out.println (Str.Charat (0)); } catch (Ausnahme E) {neue Appexception ("000001", "Null -Zeiger -Ausnahme"); }}Wenn die Ausnahme dann abnormal ist, druckt das System unsere individuellen Ausnahmeinformationen aus:
000001 [Null -Zeiger -Ausnahme] Vorgang mit dem Ausgangscode -1 abgeschlossen
Daher ist es besonders präzise und optimiert die Leistung des Systemprogramms, wodurch das Programm weniger "schwer" wird, sodass das System mit speziellen Leistungsanforderungen erforderlich ist. Beeilen Sie sich und passen Sie Ihre eigene Ausnahme an!
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Referenzwert für das Studium oder die Arbeit eines jeden hat. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen. Vielen Dank für Ihre Unterstützung bei Wulin.com.