Перейти к контенту

Как исправить ошибку java.lang.NoSuchMethodError?

Ошибка java.lang.NoSuchMethodError на Java выдается, когда программа пытается вызвать метод класса, который не существует. Метод может быть статическим или также может быть методом экземпляра.
ошибка java.lang.NoSuchMethodError

В большинстве случаев java.lang.NoSuchMethodError перехватывается компилятором, но иногда это может происходить во время выполнения. Если эта ошибка возникает во время выполнения, то единственной причиной может быть изменение структуры класса, которое сделало ее несовместимой.

 

Давайте разберем подробнее как исправить ошибку, у нас есть два класса Data и Temp, как показано ниже.

public class Data {

	public void foo() {
		System.out.println("foo");
	}
	
	public void bar() {
 		System.out.println("bar");
 	}
}
public class Temp {

	public static void main(String[] args) {

		Data d = new Data();
		d.foo();
		d.bar();

	}

}

Давайте запустим их через командную строку. Обратите внимание, что я не использую Eclipse или какую-либо другую IDE, чтобы избежать обнаружения этой ошибки во время компиляции.

pankaj:Downloads pankaj$ javac Data.java
pankaj:Downloads pankaj$ javac Temp.java
pankaj:Downloads pankaj$ java Temp
foo
bar
pankaj:Downloads pankaj$

Итак, программа выполнена, давайте продолжим и изменим определение класса данных, как показано ниже.

public class Data {

	public void foo() {
		System.out.println("foo");
	}
	
	// public void bar() {
// 		System.out.println("bar");
// 	}
}

Обратите внимание, что я удалил метод bar(). Теперь нам нужно будет скомпилировать только класс данных, а не основной класс.

pankaj:Downloads pankaj$ javac Data.java 
pankaj:Downloads pankaj$ java Temp
foo
Exception in thread "main" java.lang.NoSuchMethodError: Data.bar()V
	at Temp.main(Temp.java:7)
pankaj:Downloads pankaj$ 

Мы получили ошибку java.lang.NoSuchMethodError, потому что класс Data стал несовместим с классом Temp. Если бы мы попытались скомпилировать класс Data, мы получили бы ошибку, как показано ниже.

pankaj:Downloads pankaj$ javac Temp.java 
Temp.java:7: error: cannot find symbol
		d.bar();
		 ^
  symbol:   method bar()
  location: variable d of type Data
1 error
pankaj:Downloads pankaj$ 

Есть две основные причины:

  • Версия Jar, используемая во время компиляции, отличается от версии среды выполнения. Например, у вас мог бы быть MySQL jar в вашем приложении, имеющим другую версию от того, что присутствует в папке lib Tomcat. Поскольку Tomcat lib folder jars сначала просматривается Java Classloader, тогда возможна эта ошибка, если какой-либо метод не найден в загруженном классе.
  • Конфликт из-за того же имени класса. Например, приложение использует сторонний jar-файл с таким же полным именем класса, как у вас. Поэтому, если classloader загружает класс из другого jar.

Отладка java.lang.NoSuchMethodError

Вы можете использовать java runtime option-verbose:class, чтобы получить информацию о jar, который используется для загрузки класса. Эту конфигурацию можно задать в tomcat catalina.sh или setenv.sh.

JAVA_OPTS="$JAVA_OPTS -verbose:class"
Затем вы увидите логи, подобные приведенным ниже, которые очень полезны для выяснения фактического jar-файла, используемого при загрузке класса, и причины java.lang.NoSuchMethodError во время выполнения.

[Opened /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk
/Contents/Home/jre/lib/rt.jar]
[Loaded java.lang.Object from /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk
/Contents/Home/jre/lib/rt.jar]
[Loaded java.io.Serializable from /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk
/Contents/Home/jre/lib/rt.jar]
[Loaded com.journaldev.spring.controller.HomeController from 
file:/Users/pankaj/Downloads/apache-tomcat-8.5.16/webapps/spring-mvc-example/WEB-INF/classes/]

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)