2015-02-28 4 views
0

У меня проблема с именем NoSuchMethodError, хотя этот метод находится в моем файле jar. Сервер: Tomcat 7 Java Версия: 1.6.0_43Почему java lang nosuchmethoderror во время выполнения разрешен при изменении с класса Wrapper на примитив

Исключение: java.lang.NoSuchMethodError: com.Person.setPersonId(J)V

long l1 = 1234; 
Person p = new Person(); 
p.setPersonId(l1); 

NoSuchMethodError приходят в то время как

class Person { 
Long personId; 
public Long getPersonId() { 
    return personId; 
} 
public void setPersonId(Long personId) { 
    this.personId = personId; 
} 
}  

NoSuchM ethodError решена, когда изменение Упаковочный примитивного

class Person { 
long personId; 
public long getPersonId() { 
    return personId; 
} 
public void setPersonId(long personId) { 
    this.personId = personId; 
} 
} 
+0

Добавьте стопку, пожалуйста. – Jens

+0

Ваша программа компилируется и работает отлично - проблема не в том, что вы показали до сих пор ... – assylias

+1

какая версия jre? –

ответ

0
long l1 = 1234; here you have declared primitive long 
Person p = new Person(); 
p.setPersonId(l1); in this statement its returning l1 primitive long not Long 

и public Long getPersonId() в вашем типе метод возвращения Лонг. Вот почему это дает ошибку.

+0

В Java 6 есть 'autoboxing', поэтому можно конвертировать из long в Long. –

+0

Да, вы абсолютно правы, но в вашем случае это не возвращает Long. 'Autoboxing' должен работать здесь как концепция Java. – vvp

-1

Использовать примитив long, вместо обертки Long.

+0

Я только спрашиваю ** почему **, попробуйте выяснить, почему это произошло –

+2

Этот ответ просто пересчитывает информацию в вопросе, вам нужно объяснить причину. – Wain

1

Код в порядке в любом случае. Скорее всего, существует некоторая несоответствие между кодом, который видит компилятор, и кодом, используемым во время выполнения.

setPersonId(Long personId) и setPersonId(long personId) - это разные методы. Если ожидаемого нет, вы получите NoSuchMethodError, а не что-то вроде NotThatMethodDidYouMeanThisOneInsteadError.

Autoboxing был добавлен в Java 1.5, поэтому менее вероятно, что существует некоторая несоответствие в настройке того, какую версию языка вы используете.