둘 다 ClassNotFoundException 및 NoClassDefFoundError JVM 또는 ClassLoader가 런타임에 로드하는 동안 적절한 클래스를 찾을 수 없을 때 발생하는 오류입니다. ClassNotFoundException 확인된 예외 및 NoClassDefFoundError 체크되지 않은 오류입니다.
ClassLoader 에는 여러 유형이 있습니다. 다른 소스에서 클래스를 로드합니다. 때로는 라이브러리 JAR 파일이 누락되거나 잘못된 클래스 경로가 발생하여 로더가 런타임에 클래스를 로드할 수 없게 될 수 있습니다.
ClassNotFoundException
ClassNotFoundException Reflection을 사용하여 런타임에 클래스를 로드하려고 할 때 발생하며 해당 클래스 파일이 없으면 ClassNotFoundException 과 함께 응용 프로그램이나 프로그램이 발생합니다. 예외. 런타임에 클래스를 로드하기 때문에 컴파일 시간에 확인할 사항이 없습니다.
예시
public class ClassNotFoundExceptionTest { public static void main(String[] args) { try { Class.forName("Test"); } catch (ClassNotFoundException cnfe) { System.err.println("You are trying to search for a class is not existing. "+cnfe); } } }
출력
You are trying to search for a class is not existing. java.lang.ClassNotFoundException: Test
NoClassDefFoundError
NoClassDefFoundError 클래스가 클래스 경로의 특정 클래스로 컴파일되었지만 런타임 중에 동일한 클래스를 사용할 수 없는 경우 throw됩니다. 누락된 JAR 파일은 NoClassDefFoundError가 발생하는 가장 기본적인 이유입니다. . Java API 문서에 따르면 "현재 실행 중인 클래스가 컴파일될 때 검색된 클래스 정의가 존재했지만 정의를 더 이상 찾을 수 없습니다."
예시
class Test1 { public void show() { System.out.println("show() method called"); } } public class Test2 { public static void main(String[] args) { Test1 t = new Test1(); t.show(); } }
두 클래스를 모두 컴파일하면 두 개의 클래스 파일 Test1.class을 얻게 됩니다. 및 Test2.class, Test2 를 실행하는 동안 클래스는 Test1.class를 제거하기만 하면 됩니다. 파일을 만들면 NoClassDefFoundError 가 표시됩니다. 아래와 같이
출력
Exception in thread "main" java.lang.NoClassDefFoundError: Test1 at Test2.main(Test2.java:9)