[Java] NoClassDefFoundError!
NoClassDefFoundError는 자바 실행 시에 ClassNotFoundException과 함께 심심찮게 만나게 되는 에러이다.
이 두 가지 에러는 조금 혼란스럽다.
클래스 경로에 클래스가 없을 경우, Class.forName("SomeClass")으로 찾을 경우 ClassNotFoundException이 발생하지만, new SomeClass()로 사용한 경우에는 NoClassDefFoundError가 나게 된다. 이 경우는 컴파일 시에는 존재했던 클래스 바이트 정의를 런타임 시에 찾지 못한 경우로 대표적인 NoClassDefFoundErorr의 발생 예이다. NoClassDefFoundError가 LinkageError의 자식 클래스인 것도 이를 뒷받침해준다.
이 외에도 NoClassDefFoundError가 발생하는 경우가 있는데, 실제 Java VM에서 어떤 경우에 NoClassDefFoundError를 발생시키는지 유형을 정리해두면 문제가 발생했을 때 해결 혹은 판단에 도움이 될 것이다.
이 두 가지 에러는 조금 혼란스럽다.
클래스 경로에 클래스가 없을 경우, Class.forName("SomeClass")으로 찾을 경우 ClassNotFoundException이 발생하지만, new SomeClass()로 사용한 경우에는 NoClassDefFoundError가 나게 된다. 이 경우는 컴파일 시에는 존재했던 클래스 바이트 정의를 런타임 시에 찾지 못한 경우로 대표적인 NoClassDefFoundErorr의 발생 예이다. NoClassDefFoundError가 LinkageError의 자식 클래스인 것도 이를 뒷받침해준다.
이 외에도 NoClassDefFoundError가 발생하는 경우가 있는데, 실제 Java VM에서 어떤 경우에 NoClassDefFoundError를 발생시키는지 유형을 정리해두면 문제가 발생했을 때 해결 혹은 판단에 도움이 될 것이다.
- VirtualMachine.redefineClasses : if the bytes don't correspond to the reference type (the class names don't match).
- ClassLoader.defineClass : 바이트 코드가 정의한 클래스 이름과 정의하려는 이름이 다를 경우
- RMIClassLoader static initializer : RMIClassLoader 제공자 클래스를 찾지 못했을 때
- rmi MarshalInputStream static initializer : rmi server를 위한 시스템 클래스를 찾지 못했을 때
댓글