2011-01-08 5 views
0

장기 실행 서버 인스턴스에 대한 클래스 로더를 쓰고 있습니다. 사용자가 아직 클래스 정의를 업로드하지 않은 경우 ClassNotFoundException을 던집니다. 합리적으로 보인다.ClassLoader 예외가 memoized되었습니다

문제는 다음과 같습니다. 세 가지 클래스 (C1, C2 및 C3)가 있습니다. C1은 C2에 의존하고, C2는 C3에 의존한다. C1과 C2는 분해 가능하고, C3는 아직 (아직) 없다. C1이로드됩니다. C1은 C2를 필요로하는 동작을 수행하므로 C2가로드됩니다. C2는 C3를 요구하는 동작을 수행하므로 클래스 로더는 C3을로드하려고 시도하지만이를 해결할 수 없으며 예외가 발생합니다. 이제 C3가 클래스 경로에 추가되고 시퀀스가 ​​다시 시작됩니다 (원래로드 된 C1에서 시작). 문제는 C2가 C3을로드 할 수 없다는 것을 기억하고있는 것으로 보이며 클래스를 찾기 위해 클래스 로더에게 요청하는 것을 방해하지 않는다는 것입니다. 단지 memoized 예외를 다시 throw합니다.

분명히 C1 또는 C2를 다시로드 할 수 없습니다. C1이 이미 C2에 링크되어 있으므로 다른 클래스가 링크되어있을 수 있습니다.

나는 다른 종류의 오류를 던지려고 노력했다. 클래스가 그것을 암기하지 않기를 바랬다. 불운하게, 그런 운 없음.

로드 된 클래스가 예외에 바인딩되지 않도록 할 수있는 방법이 있습니까? 즉, 클래스 로더가 처음 성공하지 못하면 계속 시도 할 수 있기를 바랍니다.

감사합니다.

+0

http://stackoverflow.com/questions/1457863/what-is-the-difference-between-noclassdeffounderror-and-classnotfoundexception 스레드 유용 할 수 있습니다. NoClassDefFoundError를 던져야하는 것 같습니다. – Osw

+0

클래스는 클래스를 암시 적으로로드 할 때 링크 타임에 ClassNotFoundExceptions를 NoClassDefFoundErrors로 자동 변환합니다. 그럼에도 불구하고 동일한 메모 예외 처리 문제가 발생합니다. – Jim

답변

0

아니요, 불가능합니다. JVM specification 제 2.17.2 :

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.
관련 문제