Try ist wie ein Netzwerk, das alle vom Code in Try {} ausgelieferten Ausnahmen nutzt, und gibt dann die Ausnahmen zum Code in Catch {} zur Verarbeitung. Führen Sie den Code endlich schließlich aus. Unabhängig davon, ob es Ausnahmen im Code im Versuch gibt und ob der Catch -Catch die Ausnahme fängt, wird der Code endlich ausgeführt.
Während die voreingestellten Prozessoren von Java -Ausführungszeitsystemen zum Debuggen nützlich sind, möchten Sie normalerweise selbst mit Ausnahmen umgehen. Dies gibt zwei Vorteile: Erstens können Sie Fehler beheben. Zweitens kann es verhindern, dass das Programm automatisch endet. Wenn ein Fehler auftritt, werden die meisten Benutzer verwirrt, wenn Ihr Programm eine Stapelspur beendet und ausdruckt. Glücklicherweise können Sie diese Situation leicht vermeiden.
Wenn Sie sich vor Fehlern der Ausführungsperioden vorstellen und umgehen, setzen Sie einfach den Code, den Sie überwachen möchten, in den Try -Block. Geben Sie unmittelbar nach dem Try -Block das Beispiel für Ausnahmemusterfehler auf, das Sie in der Fangklausel fangen möchten:
Versuchen Sie {Code;
Zum Beispiel:
Java.io importieren. Geben Sie bitte ein Zeichen ein "); // Öffnen Sie ein Zeichen ein. Bitte versuchen Sie es auf dem Bildschirm {// Bitte geben Sie den Programmcode, den Sie überwachen möchten, im Try -Block ein. Geben Sie unmittelbar nach dem Try -Block das Ausnahmemuster an, das Sie in der Fangklausel CH = (char) system.in.read () erfassen möchten. Wenn im obigen Code ein Fehler vorhanden ist, fangen Sie {} hier; // keine Operation nach dem Fehler system.out.println ("Sie sind eingegeben:" + ch); // Ausgabe, auf die Sie eingegeben werden. Das Bildschirmzeichen: // und der Wert von ch}}
Wenn wir Java -Versuch schreiben, müssen wir oft schließlich Klauseln hinzufügen, um einige IO -Ressourcen zu schließen, zum Beispiel
InputStream ist; try {is = openInputStream (); }}
Aber wenn dieses Muster verwendet wird, machen sogar Java -Veteranen gelegentlich einige Fehler. In dem obigen Code wird beispielsweise die OpenInputStream () -Funktion während der Ausführung eine Ausnahme ausgelöst. Daher kann es nicht vom Fangblock erfasst werden, sondern wird direkt in die Anrufschicht geworfen. Ich persönlich denke, dass die elegantere Art des Schreibens darin besteht, die vom Commons-IO-Paket bereitgestellte IOUTILS.CLOSEQUEILE () -Methode direkt aufzurufen, um den Stream zu schließen (oder eine enge () Methode selbst zusammenzufassen).
Es gibt einen weiteren Vorteil bei der Verwendung dieser Schreibmethode, bei der es darum geht, dass es nicht einfach ist, Fehler beim Schließen mehrerer IO -Ressourcen wie dem folgenden Code zu machen:
InputStream ist; OutputStream os; try {is = openInputStream (); if (os! = null) os.close ();
Wenn ein Fehler in IS.CLOSE () auftritt, kann OS.CLOSE () nicht ausgeführt werden, was dazu führt, dass die Ressource, auf die das Betriebssystem nicht freigegeben wird.
Vielleicht glaubt Oracle auch, dass diese Art von Versuch ... Catch ... endlich BoilerPlpate -Code zu unnötig ist, daher habe ich einige Änderungen an der Try -Klausel in JDK 7 vorgenommen, wodurch das Schreiben eines Codes, der die Ressourcen manuell schließt Sehen Sie kompakter und einfacher aus. Zum Beispiel kann der obige Code in:
try (InputStream is = openInputStream (); outputStream os = openoutStream ();) {// etwas tun} catch (ioException e) {e.printstacetrace (e);}
Oracle ruft hier die Anweisung des Versuchs (..) die Anweisung von Try-with-Ressource auf. Es ist zu beachten, dass die von Variablen in Try (..) verwiesenen Objekte Instanzen sein müssen, die die Schnittstelle von Java.io.autoclosens implementieren. Das heißt, Ressourcen in Try-with-Ressource-Aussagen sind nicht auf IO-Ressourcen beschränkt.
Hier ist es notwendig, einige zusätzliche Erklärungen für einige Details zur Aussage mit Ressourcen abzugeben:
JDK stellt sicher, dass die Methode Close () aller Ressourcen aufgerufen wird, unabhängig davon, ob die Close () -Methode eine Ausnahme ausgelegt hat und die Reihenfolge des Anrufs aus der Reihenfolge der Ressourcenerklärung umgekehrt wird.
Alle geworfenen Ausnahmen in der Aussage mit Ressourcen werden erwischt. Wenn mehrere Ausnahmen geworfen werden, wird die anschließende Ausnahme in der vorherigen Ausnahme unterdrückt. Die unterdrückte Ausnahme kann durch Aufrufen von getuppressed () erhalten werden, die durch die Throwable -Klasse nacheinander definiert sind.
Das obige Beispiel,
Wenn Sie den Versuch verlassen. In der von os.CLOSE () ausgelösten Ausnahme fängt der Catch -Block nur die von os.CLOSE () ausgelöste Ausnahme an. Sie können die Ausnahme von IS.CLOSE () durch die GetSuppressed () -Methode erhalten.
Wenn eine IOException auftritt, wenn OpenInputStream () aufgerufen wird, wird OpenOutputStream () nicht aufgerufen, os.close () und is.CLOSE () wird nicht aufgerufen, und der Catch -Block fängt die geworfene OpenInputStream () -Ausnahme an.
Wenn eine IOException auftritt (angezeigt durch das Token E1), wird IS.CLOSE () weiterhin aufgerufen Ausnahme vom Fangblock ist E1.
Neben dem Umbau des Try -Blocks vereinfacht JDK 7 auch den Fangteil, sodass mehrere Fangklauseln verschmolzen werden können. Zum Beispiel:
try (InputStream ist = openInputStream (); outputStream os = openoutStream ();) {// etwas tun} catch (ioException | xmlParseException | xpatexception e) {e.printstacetrace (e);}
Wenn Sie mehrere Ausnahmen retweeten, müssen Sie den Ausnahmetyp nicht mehr im Detail definieren. Sie müssen nur die Ausnahme deklarieren, die bei definierter Methode ausgelöst werden muss. Zum Beispiel
// Obwohl die Ausnahme hier zur Übereinstimmung mit der geworfenen IOException verwendet wird, weiß der Compiler, dass die Ausnahme, die tatsächlich in die obere Schicht geworfen wird, public void doio () IOException {try {throck New ioException () auswirkt; ) {throw e;
PS: Ich kann mir keine Vorteile vorstellen, die diese Funktion bringen wird
JDK 7 hat andere interessante neue Syntaxfunktionen wie binäre Literale, Segmentierung langer Zahlen mit Unterstrichen, Typinferenz von generischen Parametern, Switch unterstützt die String -Matching usw. Jetzt hat JDK 8 einige nützliche Funktionen eingeführt. Ohne die Rückwärtskompatibilität zu berücksichtigen, können angemessene und flexibel angewendete Syntaxfunktionen unser Code in gewissem Maße klarer und prägnanter erscheinen lassen.