Warum ist InstantiationException eine aktivierte Ausnahme?
-
28-10-2019 - |
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?
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 zunew 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 Siee.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?
Wie Sie aus javadoc von InstantiationException javadoc
wenn eine Anwendung versucht, eine zu erstellen Instanz einer Klasse mit dem newInstance-Methode in der Klasse Class, aber Das angegebene Klassenobjekt kann nicht sein instanziiert.
Sie können solchen Code perfekt schreiben:
try { Class myClass = Class.forName("Myclass"); myClass.newInstance(); } catch (ClassNotFoundException e) { } catch (InstantiationException e) { } catch (IllegalAccessException e) { }
Es wird kein
IllegalArgumentException
ausgelöst.Über
checked
undunchecked
geht es eher darum, was die Ausnahme verursacht hat, nicht darum, ob es einfach ist, sie wiederherzustellen oder nicht.Bitte lesen Sie mehr überchecked
vs
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.