Ich werde Ihnen zuerst ein Beispiel geben (aber ganz am Ende ist die Antwort, warum die Kontroverse).
Nehmen wir an, Sie bearbeiten ein Dokument in einem Java-basierten Dokumenteditor und wählen anschließend Datei-> Speichern unter ... und speichern das Dokument auf einem Volume, für das Sie keine Schreibberechtigung haben. Der Editor würde nicht mit einem hässlichen Stacktrace auf Sie abstürzen, sondern Ihnen lediglich mitteilen, dass die Datei nicht gespeichert werden konnte, und Sie könnten die Bearbeitung fortsetzen und / oder an einem anderen Speicherort speichern.
In einem solchen Fall wurde wahrscheinlich eine geprüfte Ausnahme erwartet, abgefangen und gehandelt, um sich gnädig davon zu erholen.
Auf der anderen Seite setzen wir diese eine Division durch Null oder eine Nullzeigerausnahme voraus, die durch einen Programmierfehler verursacht wird, der seinen hässlichen Kopf nur unter bestimmten Bedingungen aufrichtet. Das kann überall im Code passieren, der RAM kann beschädigt sein usw. Kein API-Dokument würde Ihnen sagen, "diese Methode würde eine Division durch Null werfen, wenn der RAM beschädigt ist" .
Überprüfte Ausnahmen sollten Teil des Entwurfs sein und Benutzer dieser API sollten sich darauf vorbereiten, sie zu behandeln. Ungeprüfte Ausnahmen können fast überall auftreten und liegen außerhalb unserer Kontrolle.
Die Kontroverse entsteht durch Programmierer, die ungeprüfte Ausnahmen (von RuntimeException) verwenden, wenn sie geprüfte Ausnahmen verwenden sollten:
- als Shorcut, der vom Compiler nicht gestört wird
- um ihre Unterschriften einfacher aussehen zu lassen
- da sie der Ansicht sind, dass geprüfte Ausnahmen ein Abhängigkeitsproblem darstellen (wenn Sie eine neue geprüfte Ausnahme in einer implementierenden Klasse auslösen, sollten Sie die Signatur der Schnittstelle ändern) und umgekehrt.