Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么java lang nosuchmethoderror在运行时从包装类更改为原语时得到解决_Java_Oop_Wrapper_Primitive_Nosuchmethoderror - Fatal编程技术网

为什么java lang nosuchmethoderror在运行时从包装类更改为原语时得到解决

为什么java lang nosuchmethoderror在运行时从包装类更改为原语时得到解决,java,oop,wrapper,primitive,nosuchmethoderror,Java,Oop,Wrapper,Primitive,Nosuchmethoderror,我面临的问题是NoSuchMethodError,即使该方法在我的jar文件中。 服务器:Tomcat 7 Java版本:1.6.0\u 43 异常:java.lang.NoSuchMethodError:com.Person.setPersonId(J)V long l1 = 1234; Person p = new Person(); p.setPersonId(l1); NoSuchMethodError请稍候 class Person { Long personId; public

我面临的问题是NoSuchMethodError,即使该方法在我的jar文件中。 服务器:Tomcat 7 Java版本:1.6.0\u 43

异常:
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;
}   
}    
将包装更改为原语时解决了NoSuchMethodError


方法中的
public Long getPersonId()
返回类型为Long。这就是为什么它给出了一个错误

使用primitive
long
,而不是wrapper
long

,原则上这两种代码都很好。很可能编译器看到的代码与运行时使用的代码之间存在不匹配

setPersonId(长personId)
setPersonId(长personId)
是不同的方法。如果期望的方法不存在,您将不会得到这样的方法错误,而不是像NotThat Method那样的错误


是在Java 1.5中添加的,因此不太可能出现您使用的语言版本在配置上不匹配的情况。

请添加stacktrace。您的程序编译和运行良好-问题不在您目前显示的内容中…背景中的某些代码似乎使用了反射。而
Class.getMethod
对于找到具有“兼容”参数类型的方法没有什么神奇的作用。我怀疑问题在于您重新编译了
Person
,但没有使用它重新编译代码。我只是问为什么,试图找出为什么会发生这种情况。这个答案只是重申了问题中的信息,您需要解释原因。Java 6中有
自动装箱
,因此可以从long转换为long。是的,您完全正确,但在您的情况下,它不会返回long<代码>自动装箱应该作为java概念在这里工作。
class Person {
long personId;
public long getPersonId() {
    return personId;
}
public void setPersonId(long personId) {
    this.personId = personId;
}
}
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