3. Ausnahmen umschließen

Geprüfte Ausnahmen schienen in der Theorie cool zu sein, erwiesen sich in der Praxis jedoch als große Frustration.

Angenommen, Sie haben in Ihrem Projekt eine sehr beliebte Methode. Es wird von Hunderten von Stellen in Ihrem Programm aufgerufen. Und Sie beschließen, eine neue geprüfte Ausnahme hinzuzufügen. Und es kann durchaus sein, dass diese geprüfte Ausnahme wirklich wichtig und so speziell ist, dass nur die main()Methode weiß, was zu tun ist, wenn sie abgefangen wird.

Das bedeutet, dass Sie die geprüfte Ausnahme zur Klausel jeder Methode hinzufügen müssen , die Ihre besonders beliebte Methode aufruftthrows . Sowie in der throwsKlausel aller Methoden, die diese Methoden aufrufen. Und von den Methoden, die diese Methoden aufrufen.

Dadurch throwserhalten die Klauseln der Hälfte der Methoden im Projekt eine neue geprüfte Ausnahme. Und natürlich wird Ihr Projekt durch Tests abgedeckt, und jetzt werden die Tests nicht kompiliert. Und jetzt müssen Sie auch die Throws-Klauseln in Ihren Tests bearbeiten.

Und dann muss Ihr gesamter Code (alle Änderungen in Hunderten von Dateien) von anderen Programmierern überprüft werden. Und an diesem Punkt fragen wir uns, warum wir so viele blutige Änderungen an dem Projekt vorgenommen haben? Arbeitstage und fehlerhafte Tests – alles nur, um eine geprüfte Ausnahme hinzuzufügen?

Und natürlich gibt es immer noch Probleme im Zusammenhang mit der Vererbung und dem Überschreiben von Methoden. Die Probleme, die durch geprüfte Ausnahmen entstehen, sind viel größer als der Nutzen. Das Fazit ist, dass sie heutzutage nur noch wenige Menschen lieben und nur wenige Menschen sie nutzen.

Allerdings gibt es immer noch viel Code (einschließlich Standard-Java-Bibliothekscode), der diese geprüften Ausnahmen enthält. Was ist mit ihnen zu tun? Wir können sie nicht ignorieren und wissen nicht, wie wir mit ihnen umgehen sollen.

Java-Programmierer schlugen vor, geprüfte Ausnahmen in . einzuschließen RuntimeException. Mit anderen Worten: Fangen Sie alle geprüften Ausnahmen ab, erstellen Sie dann ungeprüfte Ausnahmen (z. B. RuntimeException) und lösen Sie sie stattdessen aus. Das sieht in etwa so aus:

try
{
   // Code where a checked exception might occur
}
catch(Exception exp)
{
   throw new RuntimeException(exp);
}

Es ist keine sehr schöne Lösung, aber hier gibt es nichts Kriminelles: Die Ausnahme wurde einfach in eine RuntimeException.

Bei Bedarf können Sie es dort ganz einfach abrufen. Beispiel:

Code Notiz
try
{
   // Code where we wrap the checked exception
   // in a RuntimeException
}
catch(RuntimeException e)
{
   Throwable cause = e.getCause();
   if (cause instanceof Exception)
   {
      Exception exp = (Exception) cause;
      // Exception handling code goes here
   }
}







Rufen Sie die im RuntimeExceptionObjekt gespeicherte Ausnahme ab. Die causeVariable kann ihren Typ bestimmen und ihn in einen geprüften Ausnahmetyp null

umwandeln .