[java] NoSuchMethodError를 어떻게 해결합니까?

나는군요 NoSuchMethodError내 Java 프로그램을 실행할 때 오류가 발생했습니다. 무엇이 잘못되었으며 어떻게 해결합니까?



답변

더 이상의 정보가 없으면 문제를 정확히 파악하기는 어렵지만 근본 원인은 메서드를 실행할 때 사용하는 것과 다른 버전의 메서드에 대해 클래스를 컴파일했을 가능성이 높습니다.

스택 추적보기 … 라이브러리의 객체에서 메소드를 호출 할 때 예외가 발생하면 컴파일 및 실행시 별도의 버전의 라이브러리를 사용하는 것 같습니다. 두 버전 모두 올바른 버전인지 확인하십시오.

클래스가 인스턴스화 된 객체의 메소드 호출 할 때 예외가 나타나면 당신이 만든을 한 후 빌드 프로세스에 결함이있을 것으로 보인다. 컴파일 할 때 실제로 실행중인 클래스 파일이 업데이트되었는지 확인하십시오.


답변

나는 당신의 문제를 겪고 있었고, 이것이 내가 고친 방법입니다. 다음 단계는 라이브러리를 추가하는 효과적인 방법입니다. 처음 두 단계를 올바르게 수행했지만 파일 시스템에서 “.jar”파일을 이클립스 프로젝트의 “lib”폴더로 직접 드래그하여 마지막 단계를 수행하지 않았습니다. 또한 빌드 경로와 “lib”폴더에서 이전 버전의 라이브러리를 제거해야했습니다.

1 단계-.jar을 추가하여 경로 작성

여기에 이미지 설명을 입력하십시오

2 단계-소스 및 javadoc 연결 (선택 사항)

여기에 이미지 설명을 입력하십시오

3 단계-실제로 .jar 파일을 “lib”폴더로 드래그 (선택 사항 아님)

여기에 이미지 설명을 입력하십시오


답변

리플렉션의 경우 NoSuchMethodException, 비 반사 코드의 경우을 얻습니다 NoSuchMethodError. 나는 서로 대면 할 때 매우 다른 곳을 찾는 경향이 있습니다.


답변

JVM 매개 변수를 변경할 수있는 액세스 권한이있는 경우 자세한 출력을 추가하면 어떤 JAR 파일에서 어떤 클래스가로드되는지 확인할 수 있습니다.

java -verbose:class <other args>

프로그램이 실행될 때 JVM은 다음과 같은 표준 출력 정보로 덤프해야합니다.

[파일에서로드 된 junit.framework.Assert : / C : /Program%20Files/junit3.8.2/junit.jar]


답변

이것은 일반적으로 Apache Ant 와 같은 빌드 시스템을 사용할 때 발생합니다. java 파일이 클래스 파일보다 최신 일 때 java 파일 만 컴파일하는 합니다. 메소드 서명이 변경되고 클래스가 이전 버전을 사용하는 경우 올바르게 컴파일되지 않을 수 있습니다. 일반적인 수정은 전체 재 구축 (보통 “ant clean”, “ant”)을 수행하는 것입니다.

때로는 한 버전의 라이브러리에 대해 컴파일 할 때 다른 버전에 대해서는 실행될 때이 문제가 발생할 수 있습니다.


답변

Maven 또는 다른 프레임 워크를 사용하는 경우이 오류가 거의 무작위로 발생하면 다음과 같이 새로 설치하십시오.

clean install

이것은 객체를 작성했고 객체에 메소드가 있음을 알고있는 경우 특히 효과적입니다. 나를 위해 일했다.


답변

리플렉션을 사용한 결과 일 수도 있습니다. 클래스에 반영하는 코드가 있고 이름으로 메소드를 추출하는 경우 (예 : with Class.getDeclaredMethod("someMethodName", .....)) 리팩터링 중과 같이 메소드 이름이 변경 될 때마다 매개 변수를 리플렉션 메소드로 업데이트해야합니다. 새로운 메소드 서명, 또는 getDeclaredMethod호출은NoSuchMethodException .

이것이 원인 인 경우 스택 추적은 리플렉션 메소드가 호출 된 지점을 표시해야하며 실제 메소드 서명과 일치하도록 매개 변수를 업데이트하기 만하면됩니다.

내 경험상 이것은 개인 메소드 / 필드를 단위로 테스트하고 TestUtilities클래스를 사용하여 테스트 확인을 위해 필드를 추출 할 때 가끔 발생 합니다. 일반적으로 단위 테스트를 염두에두고 설계되지 않은 레거시 코드를 사용합니다.