Was sind checked exceptions in Java/C#?
Ich bin ein C# - Entwickler tun gelegentliche Programmierung in Java. Kann mir jemand in einfachen Worten erklären, was überprüft werden Ausnahmen in Java, und warum ist Sie nötig? Noch nicht in dieser Begriff in C#.
- möglich, Duplikat der Warum dürfen nur bestimmte Ausnahmen erklärt werden geworfen in der Signatur der Methode
Du musst angemeldet sein, um einen Kommentar abzugeben.
Checked exceptions sind Ausnahmen, die der compiler benötigen Sie Griff in gewisser Weise.
In Java, überprüft Ausnahmen sind
Throwable
s nichtRuntimeException
,Error
, oder einer Ihrer Unterklassen.Den Java-Designern waren Sie erforderlich, um sicherzustellen, Programme behandelt Ausnahmen, die wurden einigermaßen wahrscheinlich. Ein klassisches Beispiel ist
IOException
. Jedes mal, wenn ein Programm hat I/O gibt es eine Möglichkeit des Scheiterns. Die Festplatte könnte voll sein, wird die Datei möglicherweise nicht vorhanden, es könnte ein problem mit Berechtigungen, etc.So, Java ist so ausgelegt, dass ein Programm syntaktisch behandeln der Ausnahme in gewisser Weise. Dies könnte mit einem catch-block, oder durch das erneute auslösen der exception in gewisser Weise.
C# nicht überprüft haben Ausnahmen. Sie beschlossen, lassen Sie dieses Problem bis zu den Entwicklern der Anwendung (interview). Geprüft Ausnahmen sind umstritten, weil Sie machen kann, code verbose, während Entwickler manchmal Griff Sie trivial mit leeren catch-Blöcke. Weiter, es können beliebige sein, die standard-Bibliothek Methoden werfen checked exceptions. Zum Beispiel, warum nicht
- Datei.delete
(ein neues Java-7-API ist dies anders) werfenIOException
?Ein weiteres Anliegen Hejlsberg erwähnt in diesem interview ist versionability. Hinzufügen einer checked exception, um eine
throw
Klausel zwingt den gesamten code mit diesem Verfahren geändert werden und neu kompiliert werden.Adding a checked exception to a throw clause forces all code using that method to be modified and recompiled
- so haben Sie für ungeprüfte Ausnahmen. Gut, außer wenn Sie denken, dassWill fail under some circumstances
ist, wie Sie möchten, um zu beschreiben, Ihre API. JEDER Ausnahme ist ein Teil der öffentlichen Schnittstelle einer Methode, hinzufügen später, ist wie zu sagen "Oh, und von nun an, dass int-parameter haben eine völlig andere semantische Bedeutung - aber keine Sorge, es ist noch binärkompatibel!"throw Exception
in Java - das hat durchaus ein stigma auf, denke ich. Aber ja, ich bin immer noch der Hoffnung für eine Lösung, die es uns ermöglicht, zu schneiden nach unten auf die boilerplate notwendig für checked exceptions, ohne die Nachteile der unkontrollierten lieben.RunTimeException
oder eine angegebene alternative). Wenn der code nicht in der Lage sein, etwas nützliches zu tun, wenn z.B. eine Datei benötigt wird für die Entschlüsselung ein Dokument nicht gefunden werden kann, zu erzwingen, dass der code zum abfangen der Ausnahme wird nicht helfen nichts. Nach Prüfung Ausnahmen Blase als Ihre gleichen Typs kann nicht hilfreich, da ein Anrufer glaubtFileNotFoundException
bedeutet, dass die document wurde nicht gefunden.In Java eine überprüft Ausnahme (als Matthew Flaschen richtig fest) ist eine Ausnahme, die der compiler benötigt Sie, um zu behandeln. Dies sind die Ausnahmen, die deklariert sind, die auf Funktion Definitionen (z.B.
function bob() throws ImNotBobException { ... }
zu sagen, dass die Funktion aufrufen kann werfen, dass die Ausnahme - z.B.NumberFormatException
beim Parsen von integer oderIOException
beim schreiben in eine Datei.Jedoch einige Ausnahmen geworfen werden können, die von unbekannten oder unerwarteten Orte, die sind einfach nur unpraktisch zu handhaben, auf jeder Ebene, so dass der compiler nicht verlangen, dass Sie mit diesen umgehen. Diese sind ungeprüften Ausnahmen. Sie kann geworfen werden, die aus verschiedenen Orten, nicht erklären zu werfen (oft durch den Versuch zum aufrufen einer Methode für ein Objekt, wenn das Objekt noch nicht initialisiert worden ist, d.h. null ist - dies wird in einem
NullPointerException
.)Hoffe, das hilft.
Checked exceptions sind Ausnahmen, die erfordern, dass jede "Konsum" - Klasse zu haben, um code, der explizit überprüft (und hoffentlich Griffe) die Ausnahme.
Zum Beispiel, wenn der Apple-Klasse hat ein Essen () - Methode, die beinhaltet, die geprüfte Ausnahme von WormFound dann code, der fordert, dass das Verfahren explizit ein Haken für die Ausnahme.
Als seitliche Anmerkung, es ist das feature von Java und nicht C#.
(Zu dem Zeitpunkt, als C# erstellt wurde, die Vorteile des aufgegebenen Ausnahmen waren nicht so offensichtlich in den Augen des C# - Teams, so waren Sie nicht enthalten.)
(ein paar Jahre später, für die Menschen, die hier ankommen, die über Google airlines)
Überprüft-Ausnahmen war ein Fehler im design der Sprache Java. ZEITRAUM. Jedesmal, wenn man eine geprüfte Ausnahme wickeln Sie Sie in eine ungeprüfte Ausnahme (wahrscheinlich eine RuntimeException).
Leider aufgrund der marketing-Fragen-erst Sonne, dann Oracle nicht in der Lage waren, offen zu erkennen Ihre Fehler.
In der Zeit, als Java erstellt wurde, die Handhabung von Ausnahmen, war nicht klar. Java-Designer naiv gedacht, dass zwingen Entwickler, um zu überprüfen, Ausnahmen bei der Kompilierung eine gute Idee war. Während dies sieht intuitiv richtig, diese aktiviert zu werden, ein anti-pattern, ähnlich wie die Verwendung von "GOTOs". Es funktionierte nie in der Praxis und verursachen zahlreiche Probleme. Ausnahmen müssen behandelt werden, die in einem "main-loop" oder "controller", denn sonst hätten Sie sein können, die behandelt werden, innerhalb der Funktion, das den Fehler, würden Sie nicht eine Ausnahme, sondern einer beabsichtigten Fehler, die unterstützt werden muss durch die normale API Rückgabewert. Eine Ausnahme, durch seine eigene Natur, ist so etwas nicht vorgesehen und nicht für normal-flow-Ausführung von code.
Bemerken zum Beispiel, dass der Frühling, die "standard" - Java framework für enterprise-app-Entwicklung einfach Grenzen zu wickeln überprüft-Ausnahmen in ungeprüfte Ausnahmen.
Als Referenz: Kotlin, entwickelt von Java-und Scala-Experten und einer der Favoriten Sprachen in stackoverflow-Umfragen), komplett verworfen überprüft Ausnahmen. Mehr info unter: Zwei