Was ist der Zweck der 'Würfe' - Anweisung in Java?
Ich bin gerade java zu lernen, aber es scheint, dass in der end-die meisten Methoden, die in den Anfang der Aufruf-stack wird nur Erklärungen 'throws Exception'. Was ist die gute Sache über diese Aussage, die ich bin fehlt, dass macht es nützlich?
Noch ein Beispiel. Nachdem einige code schreiben, habe ich beschlossen, umgestalten einer meiner Klassen ein bisschen, mit Klassen aus anderen java-Bibliotheken; als ein Ergebnis, nicht nur die Hälfte der Methoden dieser Klasse gewann noch 5 Ausnahmen in Ihren Erklärungen, aber etwa die Hälfte all meiner anderen code auch – bis ich mich entschied, ich würde besser schreiben Sie einfach 'throws exception' und kümmern sich nicht darum. Vielleicht habe ich das nur Ausnahmen falsch?
Wichtig Bearbeiten
Meine Frage war nicht etwa, was diese Aussage bedeutet – es ist ziemlich offensichtlich, von Dokumentation. Ich wurde tatsächlich gefragt, warum die Sprache, die Planer entschieden sich für diese Aussage erforderlich.
- Übrigens, dies ist keine Aussage, nur ein Schlüsselwort in Methodendeklarationen.
- Ritch, es ist C#, die im Grunde genommen geklont Java. Aber das ist neben dem Punkt. Java macht eine Unterscheidung zwischen Fehlern, die Sie HABEN zu handhaben in einigen Mode-und Laufzeit-Probleme. Dies ist nützlich, kann aber überbeansprucht worden ist, von einigen Bibliotheken.
- werfen ist eine Anweisung docs.oracle.com/javase/specs/jls/se8/html/jls-14.html
- ja, aber die Frage war über
throws
(das ist ein Schlüsselwort in Methodendeklarationen), nichtthrow
(das ist ein Schlüsselwort Einführung einer Anweisung).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl die anderen Antworten sind richtig, ich denke, Sie vermisst den Sinn in der Weise, die Sie waren, zu Fragen.
Die throws-Anweisung ist, wie Sie erstellen eine Ausnahme-stack-trace. Es gibt nicht viel Magie in java-es ist nicht irgendeine zugrunde liegende system Geheimnis, dass eine Ausnahme erzeugt, es ist einfach eine "Throw" - Anweisung, und daher die letzten paar Einträge in jedem stack-trace wird wahrscheinlich werfen.
Es ist nicht NUR der Letzte, weil in vielen Fällen die Ausnahmebehandlung besteht aus so etwas wie dieses:
Diese können Sie ändern, welche Art von exception es war, oder fügen Sie eine bessere textliche Beschreibung oder sogar behandeln einige der Ausnahmen beim re-werfen die anderen.
Deshalb ist es oft die letzten paar Level (und vielleicht noch einige dazwischen), die durch die "Throw" - Anweisung.
Java-Ansatz, um Ausnahmen zu machen, ist die Methode Anrufer bewusst Fehler Bedingungen, und daher gezwungen sein, Sie zu behandeln oder die Tatsache anerkennen, dass die Ausnahme nicht behandelt, die über eine wiederholte throws-Anweisung an den Aufrufer der Methode. Oder anders ausgedrückt, zu wissen, welche Ausnahmen ausgelöst werden, ist Teil der Methodensignatur und damit die explizite throws-Anweisung.
Für Ausfälle, die Bedingungen sind nicht zu erwarten im normalen Betrieb, es gibt zwei spezielle Arten von Ausnahmen: RuntimeException und Error. Unterklassen von dieser Ausnahme müssen nicht explizit deklariert werden, die in einer throws-Klausel oder gefangen durch den Anrufer.
Wäre es auch erwähnenswert, dass mit "throws Exception" ist schlampiger Programmierung in der Produktion, da Sie den code nicht sagen, der Aufrufer der Methode, der nichts über den tatsächlichen Ausfall Fällen. Das einzige mal, dass ich denken würde, mit Hilfe von generischen "throws Exception" - Erklärung im Gegensatz zu der Aufzählung von tatsächlichen exception-Typen ist für Fälle wie unit-tests, in denen die ausdrückliche Erklärung des Scheiterns Fällen dient keinem Zweck.
Zeigt es Benutzern der Klasse, dass eine außergewöhnliche situation entstanden ist, die Sie zu bewältigen haben. Das Thema der throws-Klausel der dem Benutzer sagt, was diese Ausnahmesituationen sind.
Wenn die Ausnahme eine geprüfte Ausnahme, die der compiler erzwingt einen try/catch-block im user-code; ungeprüften Ausnahmen nicht verlangen, einen catch-block für die Handhabung. In diesem Fall wird die Ausnahme wird weiter sprudeln die call-stack, bis es entweder behandelt werden oder das Programm beendet wird.
Nach viel Lesen über Ausnahmen und best practices, merkte ich, dass ich einen Fehler gemacht, mit Ausnahme der Klasse für die Handhabung von Programmfehlern, die ich überprüfen in buchstäblich jeder Methode – wo, wie sollte ich verwendet habe, RuntimeException, die nicht benötigt werden, geprüft. Nach dem refactoring mein code ich hab 'wirft' Aussagen nur in Orten nötig, und jetzt ist es ordentlich und sauber.
Macht Sie sich möglicher Probleme bewusst, die auftreten können, und zwingt Sie, sich entweder mit Ihnen umzugehen oder explizit sagen, dass Sie nicht sind.
In Java gibt es Überprüft Ausnahmen und Runtime-Ausnahmen.
Überprüft Ausnahmen kann nur auftreten, in Methoden, erklären Sie ausdrücklich.
Runtime-Ausnahmen auftreten können überall im code und müssen nicht deklariert werden.
Die
throws IOException
- Klausel deklariert, die in dieser Methode wird es möglicherweise eine IOException ausgelöst.Laufzeit-Exception sind diejenigen, die für die Erweiterung der Klasse RuntimeException. Alle anderen sind Überprüft Ausnahmen.
Ausnahmen sind eigentlich ausgelöst durch Aussagen wie
throw new IOException(...)
innerhalb der Methode.Wirft eine Ausnahme auslösen. Eine Ausnahme bestanden rückwärts, um die Funktion in den stack, bis es gefangen ist, der durch einen catch-block, der damit umgehen kann.
Wenn throw-Schlüsselwort in der Deklaration einer Funktion bedeutet, dass ein Aufruf dieser Methode könnte eine Ausnahme generiert. Zum Beispiel:
bedeutet, dass die methodFoo heben können, eine Ausnahme vom Typ IllegalArgumentException.
Beim Aufruf einer solchen Methode, die Sie verwenden in der Regel die folgenden try/catch-block Anweisung:
Das "gute" an diesem Ansatz ist, mit einer solchen Funktion, Sie sind nicht gezwungen, überprüfen Sie den Rückgabewert der Methode, um sicherzustellen, dass Ihre Methode nennen, geglückt ist. in der C-Sprache, die Sie normalerweise tun so etwas wie:
public void methodFoo (int val) throws IllegalArgumentException
Sie wissen, um sicherzustellen, dass es wirklich kompiliert 😉throws
kommen sollte nach der Liste der parameter