Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 ClassNotFoundException과 NoClassDefFoundError의 차이점은 무엇입니까?

<시간/>

둘 다 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)