Frage

Ich verstehe, dass geprüfte Ausnahmen diejenigen sind, von denen der Anrufer des vernünftigerweise erwarten kann, dass sie sich erholen.Ich verstehe nicht, warum dies bei InstantiationException der Fall ist.Wenn eine Klasse nicht instanziiert werden kann, was soll der Anrufer dann tun?

Ich dachte dann, dass es vielleicht eine wichtige Überlegung war, dass der Code kompiliert wurde - daher könnte dies nur passieren, wenn eine Klasse dynamisch angegeben wird. 1 In diesem Fall ähnelt die Klasse möglicherweise eher einem Parameter, aber dann haben wir IllegalArgumentException, die eine Laufzeitausnahme ist.

Was ist der Grund, warum Standardausnahmen überprüft werden und welche nicht?

1 Stimmt das?

War es hilfreich?

Lösung

Ein Grund für die explizite Behandlung dieser Ausnahme, an den ich denken kann (aber das ist keine maßgebliche Antwort):

Versuchen Sie, eine Klasse mit Reflektion zu instanziieren (da diese Klasse konfiguriert und nicht statisch verknüpft ist).Wenn die erwartete Konstruktorsignatur nicht vorhanden ist, versuchen Sie es mit einem anderen Konstruktor.Oder eine andere Klasse.Jeder Framework-Code (z. B. Spring) verfügt möglicherweise über eine solche Logik.

Andere Tipps

Aus der JavaDoc for InstantiationException:

Wird ausgelöst, wenn eine Anwendung dies versucht Erstellen Sie eine Instanz einer Klasse mit die newInstance -Methode in der Klassenklasse, Das angegebene Klassenobjekt kann dies jedoch nicht instanziiert werden, weil es ein ist Schnittstelle oder ist eine abstrakte Klasse .

Dies geschieht nur bei Verwendung von Java Reflection, z.beim programmgesteuerten Instanziieren von Objekten, z.ClassName.class.newInstance() im Gegensatz zu new ClassName() sozusagen.Es ist nur natürlich zu erwarten, dass jeder, der Reflektion verwendet, um Code zu schreiben, der solche Aberrationen wie das Instanziieren einer abstrakten Klasse oder einer Schnittstelle behandelt, oder wenn während des Konstruktoraufrufs eine Ausnahme ausgelöst wird (in diesem Fall können Sie e.getCause() verwenden).

Es wird nicht erwartet, dass es in Ihrem Code behandelt wird - sondern von dieser bestimmten API / Bibliothek, die Reflektion verwendet.

Class.newInstance () enthält eine interessante Beschreibung, wann eine InstanciationException ausgelöst wird. [javadoc] :

InstantiationException - Wenn diese Klasse eine abstrakte Klasse, eine Schnittstelle, eine Array-Klasse, einen primitiven Typ oder eine Leere darstellt.oder wenn die Klasse keinen Nullkonstruktor hat;oder wenn die Instanziierung aus einem anderen Grund fehlschlägt .

Für mich sieht es so aus, als würde versucht, alle Fälle abzudecken, in denen die Instanziierung einer statisch verknüpften Klasse beim Kompilieren fehlschlagen würde.

Der wichtigste Teil ist das Stück, das ich jedoch hervorgehoben habe. Stellen Sie sich einen Konstruktor vor, der eine aktivierte Ausnahme auslöst. Was passiert, wenn dieser Konstruktor dynamisch aufgerufen wird?Wer wird nach dieser schlecht überprüften Ausnahme suchen?

Zwar gibt es eine große Grauzone zwischen aktivierten und nicht aktivierten Ausnahmen, und viele Ausnahmen können möglicherweise auf die eine oder andere Weise entworfen werden, dies ist jedoch nicht der Fall.Es ist ein Fehler, er sollte deaktiviert sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top