遇到一个很冷门的bug(java.lang.NoSuchMethodException问题原因及解决办法)

在OA项目开发中遇到一个bug,错误为java.lang.NoSuchMethodException。问题出现在Struts2框架中,由于在Action方法中添加了参数导致。解决方法包括移除方法参数,确保Action类继承正确,检查方法的访问权限,确认使用的Struts2 jar包版本匹配,以及检查配置文件中路径的正确性。

最近做OA项目,传值到出现了问题,一直报这个错误,网上搜的问题真的是,用托尔斯泰的话说就是,每个人的成功的都是相似的,而每个人的bug却各不相同。下面我总结了几条:

1、
在action中方法不能有参数,而我把参数传进去了,也就是本来方法应该是public String checkAdmin(); 我写成了public String checkAdmin(Admin admin);

使用struts2框架出现的问题
问题就在这个参数上,struts2中是不能有参数的

解决方法:

struts2是通过反射机制来执行action的方法,struts2规范目前action方法是不需要参数的,有参数的方法和没参数的方法是两个不同的方法,所以会出现找不到的情况。

2、

你有没有试试看 其它的方法能不能用,要是都是这种情况的话,可能是你的Action类没有继承类。还有你注意下方法的参数列表,类型顺序要正确才行

3、

发现有两种错误可能引起上述异常:

在这里插入图片描述
在这里插入图片描述

我的问题再此:

一.Action 类的方法被定义成 private 类型.

如下 Action 中被访问的方法被定义成 private 类型.程序在访问其方法时,会抛出以上异常.

4、

jar版本不对

应该是3.6jar包的问题,换回3.2的包又没事了

其实java.lang.NoSuchMethodException这个异常的根本原因有两个:第一,缺少某些jar文件;第二,某些jar文件有重复。

5、

java.lang.NoSuchMethodException 这个异常是指你的action里面没有这个方法,说明已经找到了action 但是没有找到方法,所以有2个情况,

第1种情况是,你提交到的不是这个action ,查查配置文件,有没有一样的path

第2种情况,你的action里面没有这个方法 。

### 关于 `java.lang.NoSuchMethodException` 和 `Throwable.getStackTraceElement(int)` 的具体分析 #### 1. **异常的原因** `java.lang.NoSuchMethodException` 是 Java 中的一个受检异常,表示尝试通过反射机制访问某个类中的方法时,指定的方法名或签名不存在。这种异常通常发生在以下场景中: - 当程序试图通过反射调用一个不存在的方法时。 - 方法存在但由于权限问题无法被访问(例如私有方法未设置为可访问)。 对于 `Throwable.getStackTraceElement(int)` 方法不存在的情况,可能是因为运行环境使用的 JDK 版本较低,不支持此方法。`getStackTraceElement(int)` 方法是在 JDK 1.4 中引入的[^1]。因此,如果当前环境中使用的是低于 JDK 1.4 的版本,则会出现类似的 `NoSuchMethodException` 异常。 --- #### 2. **解决方法** ##### (1)确认目标方法是否存在 在使用反射之前,应先验证目标类是否确实包含所需方法。可以通过以下方式检查: ```java try { Method method = Throwable.class.getMethod("getStackTraceElement", int.class); } catch (NoSuchMethodException e) { System.err.println("The method 'getStackTraceElement' does not exist."); } ``` 如果捕获到 `NoSuchMethodException`,则说明该方法不可用。 ##### (2)升级 JDK 或调整依赖库 由于 `getStackTraceElement(int)` 方法是从 JDK 1.4 开始引入的,建议将运行环境升级至至少 JDK 1.4 及以上版本。如果是第三方库引发的问题,可以考虑更新相关依赖库以适配更高版本的 JDK。 ##### (3)兼容性处理 为了使代码能够在不同版本的 JDK 下正常工作,可以采用条件判断的方式来替代直接调用 `getStackTraceElement(int)` 方法的功能。例如: ```java public StackTraceElement getStackElement(Throwable throwable, int index) { if (!isGetStackTraceElementSupported()) { // 如果方法不存在,则手动解析 stack trace 数组 StackTraceElement[] elements = throwable.getStackTrace(); return (index >= 0 && index < elements.length) ? elements[index] : null; } try { Method method = Throwable.class.getMethod("getStackTraceElement", int.class); return (StackTraceElement) method.invoke(throwable, index); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } } private boolean isGetStackTraceElementSupported() { try { Throwable.class.getMethod("getStackTraceElement", int.class); return true; } catch (NoSuchMethodException ignored) { return false; } } ``` 上述代码实现了对低版本 JDK 的兼容性支持,同时保留了高版本功能的优势。 --- #### 3. **其他注意事项** 除了上述解决方案外,还需要注意以下几点: - 确保项目中没有混用多个版本的 JAR 文件,这可能导致某些方法在特定环境下缺失[^5]。 - 在动态代理或反射操作中,务必捕获所有潜在的异常,并对其进行妥善处理,避免因未声明的异常导致程序崩溃[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值