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

Java에 클래스가 있을 때 ClassNotFoundException이 발생하는 이유는 무엇입니까?

<시간/>

클래스를 로드하려고 할 때마다 클래스 로더가 ClassNotFoundException 지정된 경로에서 클래스를 찾을 수 없는 경우 생성됩니다.

이것은 forName()을 사용하여 명시적으로 클래스를 로드하는 Java 프로그램을 실행하는 동안 발생할 수 있습니다. Class 또는 loadClass()라는 클래스의 메서드 ClassLoader 클래스의 메소드 이 두 클래스는 클래스 이름을 나타내는 문자열 값을 수락하고 지정된 클래스를 로드합니다.

이러한 메서드에 클래스 이름을 전달하는 동안 다음을 확인해야 합니다. -

  • 이러한 메서드에 전달하는 클래스 이름은 정확해야 합니다.

  • 지정된 클래스(패키지와 함께)는 현재 디렉토리에 있거나 해당 경로가 환경 변수 classpath에 나열되어야 합니다.

예시

Sample이라는 클래스를 생성했다고 가정합니다. 디렉토리 D:// 아래와 같이 컴파일 -

package myPackage.example;
public class Sample {
   static {
      System.out.println("The class named Sample loaded successfully.........");
   }
}

편집

D:\>javac -d . Sample.java

이것은 현재 디렉토리 myPackage.example에 패키지를 생성하고 .class를 생성합니다. 샘플 파일 그 안에 수업. 따라서 이 클래스를 로드하는 동안 동일한 디렉토리에 있어야 하며 절대 클래스 이름을 Class.forName()에 전달해야 합니다. 또는 loadClass()

예시

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.exampl.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

예외

위의 프로그램을 실행하면 패키지 이름의 철자가 틀리기 때문에 다음과 같은 예외가 발생합니다.

D:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.exampl.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

다른 디렉터리에서 특정 클래스에 액세스하려는 경우 -

에 대한 클래스 경로를 설정해야 합니다.
  • .class 파일을 포함하는 폴더(가장 바깥쪽 패키지).

    또는,

  • 클래스가 포함된 jar 파일입니다.

철자 문제를 수정하고 E://

디렉토리에 있는 Java 파일에서 클래스를 로드하려고 한다고 가정합니다.

예시

public class ClassNotFoundExample {
   public static void main(String args[]) {
      try {
         Class.forName("myPackage.example.Sample");
      }catch (ClassNotFoundException ex) {
         ex.printStackTrace();
      }
   }
}

예외

지정된 클래스의 .class 파일(또는 이를 포함하는 jar 파일)이 포함된 패키지가 현재 디렉토리나 환경 변수 classpath의 경로 목록에 없기 때문에 여전히 동일한 예외가 발생합니다.

E:\>java ClassNotFoundExample
java.lang.ClassNotFoundException: myPackage.example.Sample
   at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
   at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
   at java.base/java.lang.Class.forName0(Native Method)
   at java.base/java.lang.Class.forName(Unknown Source)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

현재 시나리오에서 필수 클래스(예:"D://)를 포함하는 패키지가 포함된 디렉토리에 대한 클래스 경로를 설정합니다. ”하고 위의 자바 프로그램을 실행하여 작동시킨다.

E:\>javac ClassNotFoundExample.java
E:\>java ClassNotFoundExample
The class named Sample loaded successfully.........