Автор оригинала: 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/| в некоторых приложениях со многими зависимостями. Для этого есть две основные причины;
- Версия Jar, используемая во время компиляции, отличается от среды выполнения. Например, в вашем приложении может быть MySQL jar с версией, отличной от той, которая присутствует в папке библиотеки Tomcat. Поскольку файлы папок библиотеки tomcat сначала просматриваются Загрузчиком классов Java , существует вероятность
java.lang.Nosuchmetoderror
если в загруженном классе не найден какой-либо метод. - Конфликт из-за одного и того же имени класса. Например, ваше приложение использует стороннюю банку, у которой такое же полное имя класса, как у вас. Поэтому, если загрузчик классов загрузит класс из другого 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