Рубрики
Без рубрики

ява.ланг.Пример ошибки noSuchMethod

ява.ланг.Пример ошибки noSuchMethod, java lang Исключение ошибки noSuchMethod в потоке “основной”, обнаружение и исправление опции java tomcat подробный пример класса.

Автор оригинала: Pankaj Kumar.

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

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

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

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

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 или любую другую среду разработки, чтобы избежать обнаружения этой ошибки во время компиляции, когда я позже изменю класс Data .

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.Ошибка noSuchMethod потому что класс данных стал несовместимым с временным классом. Если бы мы попытались скомпилировать Данные класс, мы бы получили ошибку времени компиляции, как показано ниже.

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$ 

ява.ланг.noSuchMethod Ошибка в Tomcat

Большую часть времени вы будете видеть java.lang.noSuchMethod/| в некоторых приложениях со многими зависимостями. Для этого есть две основные причины;

  1. Версия Jar, используемая во время компиляции, отличается от среды выполнения. Например, в вашем приложении может быть MySQL jar с версией, отличной от той, которая присутствует в папке библиотеки Tomcat. Поскольку файлы папок библиотеки tomcat сначала просматриваются Загрузчиком классов Java , существует вероятность java.lang.Nosuchmetoderror если в загруженном классе не найден какой-либо метод.
  2. Конфликт из-за одного и того же имени класса. Например, ваше приложение использует стороннюю банку, у которой такое же полное имя класса, как у вас. Поэтому, если загрузчик классов загрузит класс из другого jar, вы получите java.lang.Ошибка noSuchMethod во время выполнения

Отладка java.lang.Неучтенная ошибка

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

JAVA_OPTS="$JAVA_OPTS -verbose:class"

Затем вы увидите журналы, как показано ниже, которые очень полезны для определения фактического jar, используемого при загрузке класса, и причины java.lang.Ошибка noSuchMethod во время выполнения.

[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/]

Это все для java.lang.Пример ошибки noSuchMethod и советы по ее обнаружению и исправлению. Я надеюсь, что это будет полезно для вас в избавлении от этой ошибки.

Ссылка: Документ API