자바 ClassNotFoundException - java.lang.ClassNotFoundException


자바 ClassNotFoundException

  • Java ClassNotFoundException은 애플리케이션이 클래스를 로드하려고 하지만 Classloader가 클래스 경로에서 찾을 수 없을 때 발생합니다.
  • java.lang.ClassNotFoundException의 일반적인 원인은 Class.forName 또는 ClassLoader.loadClass를 사용하여 다음의 문자열 이름을 전달하여 클래스를 로드하는 것입니다. 클래스이고 클래스 경로에서 찾을 수 없습니다.
  • ClassNotFoundException은 확인된 예외이므로 catch하거나 호출자에게 던져야 합니다.
  • ClassLoader를 사용하여 클래스를 간접적으로 로드하기 때문에 ClassNotFoundException은 항상 런타임에 발생합니다. Java 컴파일러는 클래스가 런타임에 클래스 경로에 있는지 여부를 알 수 있는 방법이 없습니다.
  • ClassNotFoundException의 가장 일반적인 예 중 하나는 Class.forName을 사용하여 JDBC 드라이버를 로드하려고 하지만 클래스 경로에 jar 파일을 추가하는 것을 잊어버린 경우입니다.

자바 ClassNotFoundException 예

ClassNotFoundException이 발생하는 간단한 예를 살펴보겠습니다.

package com.journaldev.exceptions;

public class DataTest {

  public static void main(String[] args) {
    try {
      Class.forName("com.journaldev.MyInvisibleClass");

      ClassLoader.getSystemClassLoader().loadClass("com.journaldev.MyInvisibleClass");

      ClassLoader.getPlatformClassLoader().loadClass("com.journaldev.MyInvisibleClass");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }

}

com.journaldev.MyInvisibleClass는 존재하지 않으므로 위의 프로그램을 실행하면 다음과 같은 예외 스택 추적이 발생합니다.

java.lang.ClassNotFoundException: com.journaldev.MyInvisibleClass
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:292)
	at com.journaldev.exceptions.DataTest.main(DataTest.java:7)

위의 예에서 세 문 모두 java.lang.ClassNotFoundException을 발생시킵니다.

ClassNotFoundException을 해결하는 방법

예외 스택 추적이 찾을 수 없는 클래스를 명확하게 지정하기 때문에 ClassNotFoundException을 수정하는 것은 매우 쉽습니다. 클래스 경로 설정을 확인하고 런타임에 클래스가 있는지 확인하십시오.

ClassNotFoundException 대 NoClassDefFoundError

NoClassDefFoundError는 런타임에 클래스를 찾을 수 없을 때 발생하는 런타임 오류입니다. ClassNotFoundException과 매우 유사합니다. API 문서에서 자세히 알아보기