문제

차이점은 무엇 입니까? NoClassDefFoundError 그리고 ClassNotFoundException?

그들이 던져지는 원인은 무엇입니까?어떻게 해결할 수 있나요?

새 jar 파일을 포함하도록 기존 코드를 수정할 때 이러한 throwable이 자주 발생합니다.webstart를 통해 배포되는 Java 앱의 클라이언트 측과 서버 측 모두에서 해당 문제를 해결했습니다.

내가 본 가능한 이유는 다음과 같습니다.

  1. 포함되지 않은 패키지 build.xml 클라이언트 측 코드의 경우
  2. 우리가 사용하고 있는 새로운 jar에 대한 런타임 클래스 경로가 누락되었습니다.
  3. 버전이 이전 jar과 충돌합니다.

오늘 이런 일이 발생하면 나는 일이 제대로 작동하도록 추적 및 오류 접근 방식을 취합니다.좀 더 명확성과 이해가 필요합니다.

도움이 되었습니까?

해결책

Java API 사양과의 차이는 다음과 같습니다.

을 위한 ClassNotFoundException:

응용 프로그램이 문자열 이름을 통해 클래스에서로드하려고 할 때 발생합니다.

  • 그만큼 forName 수업의 방법 Class.
  • 그만큼 findSystemClass 수업의 방법 ClassLoader.
  • 그만큼 loadClass 수업의 방법 ClassLoader.

그러나 지정된 이름을 가진 클래스에 대한 정의는 찾을 수 없습니다.

을 위한 NoClassDefFoundError:

Java 가상 머신 또는 a ClassLoader 인스턴스는 클래스의 정의에로드하려고 시도합니다 (일반 메소드 호출의 일부 또는 새 표현식을 사용하여 새 인스턴스 생성의 일부로). 클래스의 정의는 찾을 수 없습니다.

검색 된 클래스 정의는 현재 실행중인 클래스가 컴파일되었을 때 존재했지만 더 이상 정의를 찾을 수 없습니다.

그래서, 그것은 것 같습니다 NoClassDefFoundError 소스가 성공적으로 컴파일되었을 때 발생하지만 런타임에 필요한 class 파일을 찾을 수 없었습니다. 이것은 필요한 모든 것이 아니라 JAR 파일의 배포 또는 제작에서 일어날 수있는 일일 수 있습니다. class 파일이 포함되었습니다.

에 관해서 ClassNotFoundException, 런타임에 클래스를 반사적으로 호출하려고 시도하는 것이 불가능하지만 프로그램이 전화하려고하는 클래스는 존재하지 않습니다.

둘의 차이점은 하나는 Error 그리고 다른 하나는 an입니다 Exception. 와 함께 NoClassDefFoundError 이다 Error 그리고 예상 할 수있는 클래스를 찾는 데 문제가있는 Java 가상 머신에서 발생합니다. 컴파일 타임에서 작동 할 것으로 예상되는 프로그램은 class 파일이 발견되지 않았거나 컴파일 타임에 생성되거나 발생하는 것과 동일하지 않습니다. JVM에 의해 프로그램을 시작할 수 없으므로 이것은 매우 중요한 오류입니다.

반면에 ClassNotFoundException 이다 Exception, 그것은 다소 예상되며 회복 할 수있는 것입니다. 반사를 사용하면 오류가 발생할 수 있습니다 (예상대로 상황이 예상되지 않을 것이라는 기대가 있으므로 필요한 모든 클래스가 존재하는지 확인하는 컴파일 타임 점검이 없으므로 원하는 클래스를 찾는 데 문제가있는 모든 문제가 런타임에 나타납니다. .

다른 팁

ClassNotFoundException은 클래스 로더에서보고 된 클래스를 찾을 수 없을 때 발생합니다. 이것은 일반적으로 클래스가 클래스 경로에서 누락되었음을 의미합니다. 또한 문제의 클래스가 상위 클래스 로더에로드 된 다른 클래스에서로드하려고 시도하므로 Child Classloader의 클래스가 보이지 않습니다. 앱 서버와 같은보다 복잡한 환경에서 작업 할 때 (WebSphere는 그러한 클래스 로더 문제에 악명 높은) 때때로 이런 경우입니다.

사람들은 종종 혼동하는 경향이 있습니다 java.lang.NoClassDefFoundError ~와 함께 java.lang.ClassNotFoundException 그러나 중요한 차이점이 있습니다. 예를 들어 예외 (실제로 오류 java.lang.NoClassDefFoundError java.lang.error)의 서브 클래스입니다

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

ActiveMQConnectionFactory 클래스가 클래스 경로에 있지 않다는 것을 의미하지는 않습니다. 그것의 반대입니다. 이는 클래스 ActiveMqConnectionFactory가 클래스 로더에서 발견되었지만 클래스를로드하려고 할 때 클래스 정의를 읽는 오류가 발생했음을 의미합니다. 이것은 일반적으로 문제의 클래스에 정적 블록 또는 클래스 로더에서 찾을 수없는 클래스를 사용하는 멤버가있을 때 발생합니다. 따라서 범인을 찾으려면 해당 클래스 소스 (이 경우 ActiveMqConnectionFactory)를보고 정적 블록 또는 정적 멤버를 사용하여 코드를 찾으십시오. 소스에 액세스하지 않으면 JAD를 사용하여 디 컴파일하십시오.

코드를 검토 할 때 아래와 같은 코드 줄을 찾으십시오. 클래스 경로에 클래스가 있는지 확인하십시오.

private static SomeClass foo = new SomeClass();

팁 : 클래스가 어떤 Jar가 속한 지 알아 보려면 웹 사이트 Jarfinder를 사용할 수 있습니다. 이를 통해 와일드 카드를 사용하여 클래스 이름을 지정할 수 있으며 항아리 데이터베이스에서 클래스를 검색합니다. Jarhoo는 똑같은 일을 할 수 있지만 더 이상 무료로 사용할 수 없습니다.

jar a 클래스를 로컬 경로에 속하는 것을 찾으려면 jarscan과 같은 유틸리티를 사용할 수 있습니다. http://www.inetfeedback.com/jarscan/ ). 찾으려는 클래스와 항아리 및 지퍼 파일에서 클래스 검색을 시작하려는 루트 디렉토리 경로를 지정합니다.

NoClassDefFoundError 기본적으로 연결 오류입니다. 객체를 시도하고 인스턴스화 할 때 (정적으로 "신규") 인스턴스화 할 때 발생하며 편집 중에는 발견되지 않습니다.

ClassNotFoundException 더 일반적이며 존재하지 않는 클래스를 사용하려고 할 때 런타임 예외입니다. 예를 들어, 함수의 매개 변수가 인터페이스를 수락하고 누군가가 해당 인터페이스를 구현하는 클래스를 전달하지만 클래스에 액세스 할 수 없습니다. 또한 사용과 같은 동적 클래스 로딩의 경우에도 포함됩니다. loadClass() 또는 Class.forName().

NoclassDeffoundError (NCDFE)는 코드가 "New Y ()"을 실행할 때 발생하며 Y 클래스를 찾을 수 없습니다.

다른 의견과 마찬가지로 Y 클래스 로더에서 Y가 누락 된 것일 수 있지만 Y 클래스에 서명되지 않았거나 잘못된 서명이 있거나 Y가 코드에 표시되지 않은 다른 클래스 로더로로드 된 것일 수 있습니다. 또는 심지어 Y는 위의 이유 중 어느 것도로드 할 수없는 Z에 의존합니다.

이런 일이 발생하면 JVM은 X (NCDFE)를로드 한 결과를 기억하며 이유를 알지 않고 Y를 요청할 때마다 새로운 NCDFE를 던질 것입니다.

class a {
  static class b {}
  public static void main(String args[]) {
    System.out.println("First attempt new b():");
    try {new b(); } catch(Throwable t) {t.printStackTrace();}
    System.out.println("\nSecond attempt new b():");
    try {new b(); } catch(Throwable t) {t.printStackTrace();}
  }
}

이것을 어딘가에 A.java로 저장하십시오

이 코드는 단순히 새로운 "B"클래스를 두 번 인스턴스화하려고 시도합니다. 그 외에는 버그가 없으며 아무것도하지 않습니다.

코드를 컴파일하십시오 javac a.java, 그런 다음 호출하여 A를 실행하십시오 java -cp . a - 두 줄의 텍스트를 인쇄해야하며 오류없이 잘 실행해야합니다.

그런 다음 "A $ B.class"파일을 삭제하거나 누락되거나 손상된 클래스를 시뮬레이션하려면 "A $ B.class"파일을 삭제하거나 A.class를 복사하십시오. 다음은 다음과 같습니다.

First attempt new b():
java.lang.NoClassDefFoundError: a$b
    at a.main(a.java:5)
Caused by: java.lang.ClassNotFoundException: a$b
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    ... 1 more

Second attempt new b():
java.lang.NoClassDefFoundError: a$b
    at a.main(a.java:7)

첫 번째 호출은 클래스를 찾을 수없는 클래스 로더가 클래스 로더에 의해 던져지면서 ClassNotFoundException (클래스 로더에 의해 던져짐)을 초래하며,이 코드에 해당하므로 확인되지 않은 noclassdeffounderror에 래핑해야합니다 (해당 코드).new b()) 그냥 작동해야합니다.

두 번째 시도는 물론 실패 할 것이지만, 알 수 있듯이 클래스 로더는 실패한 클래스 로더를 기억하는 것처럼 보이기 때문에 랩핑 된 예외는 더 이상 없습니다. 당신은 실제로 무슨 일이 있었는지에 대한 단서가 전혀없는 NCDFE 만 본다.

따라서 근본 원인이없는 NCDFE를 본다면 오류의 원인을 찾기 위해 클래스가 처음로드되었을 때 다시 추적 할 수 있는지 확인해야합니다.

에서 http://www.javaroots.com/2013/02/classnotfoundexception-vs.html:

ClassNotFoundException : 클래스 로더가 클래스 경로에서 필요한 클래스를 찾을 수없는 경우에 발생합니다. 따라서 기본적으로 클래스 경로를 확인하고 클래스 경로에서 클래스를 추가해야합니다.

NoClassDefFoundError : 이것은 디버깅하고 이유를 찾기가 더 어렵습니다. 이것은 컴파일 시간에 필요한 클래스가 존재할 때 발생하지만, 런 시간에는 클래스가 변경되거나 제거되거나 클래스의 정적 초기화가 예외를 던졌습니다. 이는로드되는 클래스가 클래스 경로에 존재한다는 것을 의미하지만,이 클래스에서 요구하는 클래스 중 하나는 컴파일러에 의해 제거되거나로드되지 않았다. 따라서이 수업에 의존하는 수업을 볼 수 있습니다.

예시:

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

이제 두 클래스를 컴파일 한 후 Test1.class 파일 및 테스트 클래스를 실행하면 던지는 경우

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

ClassNotFoundException: 응용 프로그램이 이름을 통해 클래스에로드하려고 할 때 던져졌지만 이름을 가진 클래스에 대한 정의는 찾을 수 없습니다.

NoClassDefFoundError: Java 가상 기계가 클래스의 정의에로드하려고 시도하고 클래스의 정의를 찾을 수없는 경우.

그들 각각을 얻는 이유는 무엇이며 그러한 오류를 처리하는 방법에 대한 사고 과정은 무엇입니까?

그들은 밀접하게 관련되어 있습니다. ㅏ ClassNotFoundException Java가 이름으로 특정 클래스를 찾고 성공적으로로드 할 수 없었을 때 던져졌습니다. ㅏ NoClassDefFoundError Java가 기존 코드로 연결된 수업을 찾았지만 어떤 이유로 든 다른 이유 (예 : 잘못된 Classpath, 잘못된 버전의 Java, 도서관의 잘못된 버전)를 찾을 수 없었을 때 던져지고 있습니다. 그것은 무언가가 잘못되었음을 나타냅니다.

C 배경이 있다면 CNFE는 실패와 같습니다. dlopen()/dlsym() NCDFE는 링커의 문제입니다. 두 번째 경우, 관련 클래스 파일은 실제로 사용하려는 구성에서 컴파일되지 않아야합니다.

예제 #1 :

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

만약에 com/example/Class1 클래스 경로에 존재하지 않으면 던졌습니다. ClassNotFoundException.

예제 #2 :

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

만약에 com/example/Class2 B를 컴파일하는 동안 존재했지만 실행 중에는 찾을 수 없었습니다. NoClassDefFoundError.

둘 다 실행 시간 예외입니다.

classNotFoundException 문자열을 통해 클래스를 참조하여 클래스를로드하려는 시도가있을 때 발생합니다. 예를 들어 클래스의 매개 변수는 문자열이며, 이는 무효 바이너리 이름이 클래스 로더로 전달 될 가능성을 높입니다.

ClassNotFoundException은 잠재적으로 유효하지 않은 이진 이름이 발생할 때 발생합니다. 예를 들어, 클래스 이름에 '/'문자가있는 경우 ClassNotFoundException을 얻을 수 있습니다. 또한 직접 참조 된 클래스를 클래스 스팟에서 사용할 수 없을 때 발생합니다.

반면에, noclassdeffounderror 던져졌다

  • 클래스의 실제 물리적 표현 - .class 파일을 사용할 수 없으면
  • 또는 클래스는 이미 다른 클래스 로더에로드되었습니다 (일반적으로 상위 클래스 로더가 클래스를로드 했으므로 클래스를 다시로드 할 수 없습니다),
  • 또는 호환되지 않는 클래스 정의가 발견 된 경우 클래스 파일의 이름이 요청 된 이름과 일치하지 않습니다.
  • 또는 종속 클래스를 찾아로드 할 수없는 경우 (가장 중요한). 이 경우 직접 참조 된 클래스가 위치 및로드되었을 수 있지만 종속 클래스를 사용할 수 없거나로드 할 수 없습니다. 이것은 직접 참조 된 클래스를 클래스를 통해로드 할 수있는 시나리오입니다. 이것은 링키지의 고장을 나타냅니다.

요컨대, noclassdeffounderror는 일반적으로 클래스 로더가 클래스 정의를 찾거나로드 할 수없는 경우 (classNotFoundException에 대한 문자열 기반 클래스로드와 달리) 이전에 결석 한 클래스를로드하는 new () 문 또는 메소드 호출에 던져집니다. 에스).

결국 클래스를로드 할 수 없을 때 ClassNotFoundException 인스턴스를 던지는 것은 클래스 로더 구현에 달려 있습니다. 대부분의 사용자 정의 클래스 로더 구현은 UrlClassLoader를 확장하기 때문에이를 수행합니다. 일반적으로 클래스 로더는 메소드 구현에 대해 noclassdeffounderror를 명시 적으로 던지지 않습니다.이 예외는 일반적으로 클래스 로더 자체가 아니라 핫스팟 컴파일러의 JVM에서 던져집니다.

ClassNotFoundException과 NoclassDeffounderRor의 차이

enter image description here

이름 자체만으로 우리는 쉽게 식별할 수 있습니다. Exception 그리고 다른 하나는 출신이야 Error.

예외: 프로그램 실행 중 예외가 발생합니다.프로그래머는 try catch 블록을 통해 이러한 예외를 처리할 수 있습니다.두 가지 유형의 예외가 있습니다.컴파일 타임에 발생하는 예외를 확인했습니다.런타임 시 발생하는 런타임 예외는 일반적으로 잘못된 프로그래밍으로 인해 발생합니다.

오류: 이는 전혀 예외가 아니며 프로그래머의 범위를 벗어납니다.이러한 오류는 일반적으로 JVM에서 발생합니다.


enter image description here 이미지 출처

차이점:

ClassNotFound예외:

  • 클래스 로더가 실패함 확인하다 우리가 언급한 클래스 바이트 코드 링크 단계 ~의 클래스 로딩 하위 시스템 우리는 얻는다 ClassNotFoundException.
  • ClassNotFoundException 다음에서 직접 파생된 확인된 예외입니다. java.lang.Exception 클래스를 명시적으로 처리해야 합니다.
  • ClassNotFoundException 있을 때 나타납니다. 명시적 로딩 ClassLoader.loadClass(), Class.forName() 및 ClassLoader.findSystemClass()를 사용하여 런타임 시 클래스 이름을 제공하여 클래스를 관리합니다.

NoClassDefFound오류:

  • 클래스 로더가 실패함 해결 클래스의 참조 링크 단계 ~의 클래스 로딩 하위 시스템 우리는 얻는다 NoClassDefFoundError.
  • NoClassDefFoundError 다음에서 파생된 오류입니다. LinkageError 클래스는 클래스가 다른 클래스에 종속되어 있고 해당 클래스가 컴파일 후에 호환되지 않게 변경된 오류 사례를 나타내는 데 사용됩니다.
  • NoClassDefFoundError 의 결과이다 암시적 로딩 해당 클래스의 메서드 호출이나 변수 액세스로 인해 클래스가 손상되었습니다.

유사점:

  • 둘 다 NoClassDefFoundError 그리고 ClassNotFoundException 런타임 시 클래스를 사용할 수 없는 것과 관련이 있습니다.
  • 둘 다 ClassNotFoundException 그리고 NoClassDefFoundError Java 클래스 경로와 관련이 있습니다.

클래스 로더 Sussystem 동작을 감안할 때 :

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

이것은 차이점을 이해하는 데 많은 도움이되는 기사입니다. http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

클래스 로딩 중에 오류가 발생하면 서브 클래스 인스턴스 LinkageError (직간접 적으로)로드되는 클래스 또는 인터페이스를 사용하는 프로그램의 한 지점에서 던져야합니다.

Java 가상 머신이 검증 중 (§5.4.1) 또는 해상도 (§5.4.3) (초기화 (§5.5)) 및 C의로드를 시작하는 데 사용되는 클래스 로더를로드하려고 시도하는 경우 인스턴스를 던집니다 classNotFoundException, 그러면 Java 가상 머신은 인스턴스를 던져야합니다. noclassdeffounderror 그 원인은의 사례입니다 classNotFoundException.

그래서 a classNotFoundException 근본 원인입니다 noclassdeffounderror.
그리고 a noclassdeffounderror 유형 로딩 오류의 특별한 경우입니다. 연결 단계.

실제로 가능한 한 가지 이유를 추가하십시오.

  • ClassNotFoundException : Cletus가 말했듯이, 상속 된 클래스의 인터페이스가 클래스 경로에 있지 않은 동안 인터페이스를 사용합니다. 예 : 서비스 제공 업체 패턴 (또는 서비스 로케이터) 존재하지 않는 클래스를 찾으십시오
  • noclassDeffoundError : 주어진 클래스의 종속성은 찾을 수없는 동안 주어진 클래스가 발견됩니다.

실제로, 오류 던질 수 있습니다 아무 말 않고, 예를 들어 타이머 작업을 제출하고 타이머 작업에서 발생합니다. 오류, 대부분의 경우 프로그램 만 예외. 그럼 시간제 노동자 메인 루프는 정보없이 종료됩니다. noclassdeffounderror와 유사한 오류가 있습니다 ExceptionInitializerError, 정적 이니셜 라이저 또는 정적 변수의 이니셜 라이저가 예외를 던질 때.

classNotFoundException jvm에 class.forname () 또는 classload.findsystemclass () 또는 classload.loadclass () 메소드를 사용하여 문자열 이름으로 클래스를로드하도록 JVM에 클래스를로드 할 때 발생하는 확인 된 예외입니다.

대부분의 경우,이 예외는 필요한 JAR 파일로 클래스 경로를 업데이트하지 않고 응용 프로그램을 실행하려고 할 때 발생합니다. 예를 들어, 데이터베이스 iemysql에 연결하기 위해 JDBC 코드를 수행 할 때이 예외를 보았을 수 있지만 ClassPath에는 JAR이 없습니다.

noclassdeffounderror JVM이 코드 실행의 일부인 특정 클래스를로드하려고 할 때 (일반 메소드 호출의 일부 또는 새 키워드를 사용하여 인스턴스 생성의 일부로) 오류가 발생하며 해당 클래스는 클래스 경로에 존재하지 않지만 존재했습니다. 컴파일 시간에 프로그램을 실행하려면 컴파일을 컴파일해야하며 컴파일러가 아닌 클래스를 사용하려면 컴파일러 오류가 발생합니다.

아래는 간단한 설명입니다

enter image description here

당신은 읽을 수있다 ClassNotFoundException vs NoclassDeffounderRor에 관한 모든 것 자세한 사항은.

새로 고침해야 할 때 계속해서 나 자신을 상기시켜줍니다.

classNotFoundException

클래스 계층

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

디버깅하는 동안

  1. 필수 항아리, 클래스 경로에서 클래스가 누락되었습니다.
  2. 필요한 모든 항아리가 JVM의 클래스 경로에 있는지 확인하십시오.

noclassdeffounderror

클래스 계층

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

디버깅하는 동안

  1. 동적으로 클래스를로드하는 데 문제가 제대로 컴파일되었습니다.
  2. 정적 블록, 생성자, init () 종속 클래스의 방법 및 실제 오류는 여러 레이어로 래핑됩니다.
  3. 종속 클래스의 정적 블록에서 "ClassNotFoundException"에 직면 할 때
  4. 클래스 버전의 문제. 이는 다른 JAR/패키지에 동일한 클래스의 두 가지 버전 v1, v2가있을 때 발생합니다. V1을 사용하여 성공적으로 컴파일 된 V1 및 V2는 관련 메소드/Vars가없는 런타임에로드 되며이 예외가 표시됩니다. [나는 클래스 경로에 나타난 여러 항아리에서 Log4J 관련 클래스의 복제본을 제거 하여이 문제를 한 번 해결했습니다.

ClassNotFoundException 및 NoclassDeffoundError는 런타임에 특정 클래스를 찾을 수 없을 때 발생하지만 다른 시나리오에서 발생합니다.

classNotFoundException은 class.forname () 또는 loadclass () 메소드를 사용하여 런타임에 클래스를로드하려고 할 때 발생하는 예외이며, 언급 된 클래스는 클래스 경로에서 찾을 수 없습니다.

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }



    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

noclassDeffoundError는 컴파일 타임에 특정 클래스가 존재하지만 실행 시간에 누락 된 경우 발생하는 오류입니다.

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

위의 프로그램을 컴파일하면 두 개의 .class 파일이 생성됩니다. 하나는 A.class이고 다른 하나는 B.class입니다. A.class 파일을 제거하고 B.class 파일을 실행하면 Java 런타임 시스템은 다음과 같이 noclassdeffounderror를 던집니다.

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top