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 파일 덤프
3.2. method 변경후 class 파일 덤프
이 상태에서 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 메서드인거)
4. 해결방법
내가 수정한 클래스 A의 메서드 methodA를 호출하는 class 들을 다시 빌드해주면 해결
5. Method Descriptors
- ()Lcom.company.DataObject
* Void : V
* 그외 Object : L+클래스내부바이너리이름(흔히알고있는 클래스파일)