본문 바로가기

카테고리 없음

[java]java.lang.NoSuchMethodError

728x90
반응형

1.요약: 메서드를 찾지 못함. 

2.발생가능 케이스

 1) 특정 메서드의 리턴이 void 였으나 return object 가 생겨버린경우 발생가능. 

//A 클래스 
public class A {
    public void methodA(){
        System.out.println("LOG");
    }
}

// 메인클래스 
public class Main {
    public static void main(String[] args) 
        A oA = new A();
        oA.methodA();
    }
}
//A 클래스 (DataObject 리턴하도록 수정)
public class A {
    public DataObject methodA(){
        DataObject oDataObject = new DataObject();
        System.out.println("LOG");
        return oDataObject;
    }
}

// 메인클래스 
public class Main {
    public static void main(String[] args) 
        A oA = new A();
        oA.methodA();
    }
}

   - A.java 의 method 만 수정하고 해당 A만 build 하여 class 파일 생성 .. (* Main class 는 빌드 다시 안함) 

   - A.java 의 수정된 method 호출중인 Main 클래스에서 위 오류 발생. 

 

3. class 파일 Hex dump 확인

 3.1. method void 변경하기 전 class 파일 덤프 

methodA void 상태일때 class 파일 Hex 덤프
Main 클래스파일 hex 덤프

 3.2. method 변경후 class 파일 덤프 

methodA return object를 DataObject로 수정했을 때 hex dump

       

Main 클래스파일 hex 덤프 (빌드하지 않았으므로 이전과 같은 상태)

 

 이 상태에서 Main 클래스에서 methodA 호출시 methodA를 찾지 못함. 

Exception in thread "main" java.lang.NoSuchMethodError: com.company.A.methodA()V
        at com.company.Main.main(Main.java:8)

클래스 A 파일에 더이상 methodA()V 가 없기 때문 임 

 V는 아래 Method Descriptors 에 정의되어있는 void 임 . ( methodA를 호출하는데 이건 void 메서드인거) 

java의 Method Descriptors 에 의해 void인경우 V로 식별중

 

4. 해결방법

 내가 수정한 클래스 A의 메서드 methodA를 호출하는 class 들을 다시 빌드해주면 해결 

 

Main 클래스파일 hex 덤프 (빌드하지 않았으므로 이전과 같은 상태)
Main class 를 다시 빌드(변경된 메서드의  method descriptor 호출하게 됨)

   5. Method Descriptors

     - ()Lcom.company.DataObject

새로 추가된 내용 해석

       * Void : V 

       * 그외 Object : L+클래스내부바이너리이름(흔히알고있는 클래스파일)

728x90
반응형