处理java.lang.NoSuchMethodError的建议

时间:2012-10-16 01:40:33

标签: java exception jboss struts nosuchmethoderror

以下是我遇到的错误:

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;

在反编译类之后,我发现应该有一个“Ljava / lang / String”作为第一个参数。正如你可以看到缺少参数的错误。所以我反编译了调用方法的类,它有一个字符串作为第一个参数。

这是我对这里发生的事情感到困惑的地方。根据时间戳,最后一次修改此代码是2007年。这个错误出现在大约一周前。

这是在JBoss 4.0.0DR3上运行的struts应用程序。据我所知,服务器上没有软件升级。

我也尝试停止JBoss,删除所有临时目录并重新启动。

有人对下一步采取任何建议吗?

编辑:

这里有更多的stacktrace

java.lang.NoSuchMethodError: com.Order.getList(Lepo/User;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/util/ArrayList;
    at com.ViewStatusAction.retrieveList(ViewStatusAction.java:325)
    at com.ViewStatusAction.executeAction(ViewStatusAction.java:115)
    at com.BaseAction.execute(BaseAction.java:42)
    at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)

2 个答案:

答案 0 :(得分:6)

我假设com.Ordercom.ViewStatusAction都是应用程序代码,而不是第三方代码。

该异常意味着您的某种版本不匹配。

  • ViewStatusAction类期望Order中有一个带有此签名的方法:

    java.util.ArrayList getList(Lepo.User arg0, 
                                String arg1, String arg2, 
                                String arg3, String arg4)
    
  • Order类未声明具有该签名的方法。 (它可能有不同的签名,或者可能根本不存在。)

当您最初编译ViewStatusAction时,编译器能够找到该方法。但是现在,运行时系统无法再找到它。这只能意味着您使用的Order版本与ViewStatusAction类编译的版本不同。

你需要找出你现在遇到这种不匹配的原因。可能的解释包括:

  • 您已部署了其中一个类的新版本,但未部署另一个版本的新版本。

  • 您已经部署了其中一个类的过时版本。

  • 您的类路径中有一个或多个类的两个版本,并且您无意中更改了类路径搜索顺序。

您需要做的是找出不兼容类的来源,以及它们是如何实现的。一旦你弄明白了,修复可能是不言而喻的。


我注意到你的FQ类名称不符合公认的标准:

  1. 包名称应以您组织的域名开头,反之。 “COM”。是错的。
  2. 包名称应全部为小写。如果它是包名,“Lepo”是错误的,如果它是默认包中的类,那也是错误的。
  3. (您的问题可能是修复伪造Lepo.User名称的后果......)

答案 1 :(得分:0)

运行时jar可能与用于编译代码的jar不同。您可能在类路径上有多个包含相同类并且相互遮蔽的jar。您可能想要检查应用服务器运行时类路径和jar顺序。