2011-01-08 18 views
0

Ich schreibe einen Klassenlader für eine lange laufende Serverinstanz. Wenn ein Benutzer noch keine Klassendefinition hochgeladen hat, werfe ich eine ClassNotFoundException; scheint vernünftig.ClassLoader-Ausnahmen werden protokolliert

Das Problem ist das: Es gibt drei Klassen (C1, C2 und C3). C1 hängt von C2 ab, C2 von C3. C1 und C2 sind auflösbar, C3 ist (noch) nicht. C1 ist geladen. C1 führt anschließend eine Aktion durch, die C2 erfordert, also wird C2 geladen. C2 führt daraufhin eine Aktion durch, die C3 erfordert, so dass der Klassenlader versucht, C3 zu laden, aber nicht lösen kann, und eine Ausnahme wird ausgelöst. Jetzt wird C3 dem Klassenpfad hinzugefügt und die Sequenz wird neu gestartet (ausgehend von dem ursprünglich geladenen C1). Das Problem ist, C2 scheint sich daran zu erinnern, dass C3 nicht geladen werden konnte, und fragt den Klassenlader nicht, ob er die Klasse finden kann ... es wirft die memoisierte Ausnahme einfach erneut.

Natürlich kann ich C1 oder C2 nicht neu laden, weil andere Klassen möglicherweise mit ihnen verbunden sind (wie C1 bereits mit C2 verbunden hat).

Ich habe versucht, verschiedene Arten von Fehlern zu werfen, in der Hoffnung, die Klasse könnte sie nicht merken. Leider kein solches Glück.

Gibt es eine Möglichkeit, die Bindung der geladenen Klasse an die Ausnahme zu verhindern? Das heißt, ich möchte, dass der Klassenlader es weiter versuchen darf, wenn es beim ersten Mal nicht gelingen sollte.

Danke!

+0

http://stackoverflow.com/questions/1457863/what-is-the-difference-between-noclassdeffounderror-and-classnotfoundexception Thread könnte nützlich sein. Sieht aus, als sollten Sie NoClassDefFoundError werfen. – Osw

+0

Java konvertiert ClassNotFoundExceptions automatisch zu Verbindungszeit in NoClassDefFoundErrors, wenn Klassen implizit geladen werden. Unabhängig davon tritt das gleiche Ausnahmefehlerproblem auf. – Jim

Antwort

0

Nein, das ist nicht möglich. Abschnitt 2.17.2 des JVM specification:

If an error occurs during class loading, then an instance of one of the following subclasses of class LinkageError will be thrown at any point in the program that (directly or indirectly) uses the type:

...

  • NoClassDefFoundError: No definition for a requested class or interface could be found by the relevant class loader.
Verwandte Themen