Warum werden im Oracle Java-Lernprogramm aktivierte oder nicht aktivierte Ausnahmen als "Kontroverse" bezeichnet?

10

Ich bin neu in Java und habe die Dokumentation zu Ausnahmen gelesen . und insbesondere die Seite " Ungeprüfte Ausnahmen - Die Kontroverse ".

Das Fazit lautet:

Wenn von einem Client vernünftigerweise erwartet werden kann, dass er sich von einer Ausnahme erholt, machen Sie ihn zu einer aktivierten Ausnahme. Wenn ein Client nichts tun kann, um die Ausnahme wiederherzustellen, machen Sie es zu einer nicht aktivierten Ausnahme.

Ich verstehe den Artikel nicht. Worum geht es bei „der Kontroverse“? Können Sie es in einfachen Worten erklären?

ABcDexter
quelle
Bitte sehen Sie die aktualisierte Frage, ich glaube nicht, dass dies ein Duplikat ist :)
ABcDexter
3
"Ich habe versucht, es zu lesen" - was ist passiert?
Nutzlos
2
Es wird so genannt, weil es viele Kontroversen um dieses Thema gibt. Siehe auch diese StackOverflow-Frage: Der Fall gegen geprüfte Ausnahmen, in dem einige Zitate berühmter / einflussreicher Personen erwähnt werden
Hulk

Antworten:

3

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.
Tulains Córdova
quelle
"Sie sollten die Signatur der Schnittstelle ändern" - nun, Sie werden sogar vom Compiler dazu gezwungen, und Sie müssen damit umgehen oder deklarieren, dass sie an jedem Aufrufstandort ausgelöst wird.
Hulk
3
Ob eine UI-Anwendung einen Fehler auf benutzerfreundliche Weise richtig behandelt, hängt davon ab, wie gut der Programmierer den Code geschrieben hat. Sie können den Code auf diese Weise mit ungeprüften Ausnahmen einwandfrei schreiben, genauso wie jemand anderes die Fehler mit aktivierten Ausnahmen falsch behandeln kann. Die Absicht der überprüften Ausnahmen ist es, Programmierern den richtigen Umgang mit Fehlern zu erleichtern. Die Kontroverse ist nicht das, was Sie hier behauptet haben, sondern ob sie das Ziel, die Fehlerbehandlung tatsächlich zu vereinfachen, tatsächlich erfolgreich erreichen oder nicht. Nach Ansicht vieler tun sie dies nicht; sie machen es schwieriger.
Servy
@Servy Auf welche benutzerfreundliche Weise könnte eine UI-App mit der Tatsache umgehen, dass ein RAM-Chip ausfällt oder keine CPU-Zyklen mehr auftreten, weil eine andere Software fehlerhaft funktioniert?
Tulains Córdova
1
@ TulainsCórdova In jedem dieser Fälle wird das Programm nicht einmal zu gehen laufen , so gibt es keine Ausnahme done Umgang mit Zeit , so wie Sie versuchen , einen Fehler zu repräsentieren irrelevant ist , wenn man überhaupt noch nicht in der Lage sind zu einem Ihrer Lauf Code, wenn es passiert.
Servy
1
@ TulainsCórdova Sie müssen nicht unbedingt auf den Fehler gestoßen sein, um ihn zu behandeln, aber ja, der Compiler wird Ihnen nicht sagen, dass er ausgelöst werden könnte. Die Kontroverse ist, ob der Compiler, der Ihnen sagt, dass die Ausnahme ausgelöst werden könnte, tatsächlich hilfreich ist. Einige denken, dass es so ist, andere denken, dass es nicht so ist. Die Frage hier ist, was die Kontroverse ist , und das ist die Antwort. Ihre Aussage darüber, was die Kernkontroverse der geprüften Ausnahmen ist, ist es nicht.
Servy
-4

Auf dieser Seite gibt es keine Kontroversen. Es ist Oracle, das die Leute auffordert, geprüfte Ausnahmen zu verwenden.

Die gefälschte "Kontroverse", die sie hier erfunden haben, ist zwischen den Sprachdesignern und den Sprachnutzern. Die Designer erlaubten den Menschen, Dinge zu werfen und zu fangen, die (in ihren Gedanken) nicht geworfen oder gefangen werden sollten. Also erstellten sie eine Webseite, auf der sie sich über faule Entwickler beschwerten.

Ascotan
quelle
4
Es gibt eine Kontroverse, auch wenn diese Seite wenig darüber aussagt. Umstritten ist die Antwort auf die Frage: "Helfen oder behindern geprüfte Ausnahmen die Entwicklung besserer Software?" Und: "Wenn ja, welche Ausnahmen sollten überprüft und welche deaktiviert werden?" Ich wette, dass Sie eine lebhafte Diskussion beginnen könnten, wenn Sie genug Entwickler (und Bier) in einem Raum zusammen haben, um diese Fragen zu beantworten.
Solomon Slow