java.lang.NoSuchMethodException: <init>

本文详细解析了在使用MyBatis框架时遇到的NoSuchMethodException异常,该异常源于OrderItem类构造器参数顺序与映射文件中定义的顺序不匹配。文章通过对比类属性与构造器参数,指出问题所在,并提供了解决方案。

报错信息(捡重要的):

java.lang.NoSuchMethodException: com.mmall.pojo.OrderItem.<init>(java.lang.Integer, java.lang.Integer, java.lang.Long, java.lang.Integer, java.lang.String, java.lang.String, java.math.BigDecimal, java.lang.Integer, java.math.BigDecimal, java.util.Date, java.util.Date)
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.getDeclaredConstructor(Class.java:2178)
	at org.apache.ibatis.reflection.factory.DefaultObjectFactory.instantiateClass(DefaultObjectFactory.java:68)
	at org.apache.ibatis.reflection.factory.DefaultObjectFactory.create(DefaultObjectFactory.java:50)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createParameterizedResultObject(DefaultResultSetHandler.java:630)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:595)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:574)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:379)
	at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:338)
	

其实许多信息根本不用看,就看第一句,我给你截下来

java.lang.NoSuchMethodException: com.mmall.pojo.OrderItem.<init>(java.lang.Integer, java.lang.Integer, java.lang.Long, java.lang.Integer, java.lang.String, java.lang.String, java.math.BigDecimal, java.lang.Integer, java.math.BigDecimal, java.util.Date, java.util.Date)

为什么会报这种错误?

其实很简单,就是OrderItem这个类实例化出错了

给你们看看属性,然后再看看构造器

public class OrderItem {
    private Integer id;

    private Integer userId;

    private Long orderNo;

    private Integer productId;

    public OrderItem(Integer id, Long orderNo, Integer productId, Integer userId) {
        this.id = id;
        this.orderNo = orderNo;
        this.productId = productId;
        this.userId = userId;
    }

然后你再看看上面我用红色标明的错误信息,当mybatis加载这个类的时候,是按照顺序来加载的。

第二个明显是Integer类型,然后你看看构造器参数的顺序,是不是有问题。

改过来就行了。(注意:当写重载构造器的时候,一定要按照顺序来传递参数

 

### 三级标题:NoSuchMethodException 引发的 RuntimeException 及其解决方案 在 Android 开发中,当尝试通过反射创建 `InputEventReceiver` 或其子类时,可能会遇到 `java.lang.RuntimeException` 包含 `NoSuchMethodException` 的问题。此类异常通常发生在构造方法查找失败时,例如在使用 `InputChannel` 和 `Looper` 参数调用构造函数时未能找到匹配的构造器。 一种常见情况是开发者自定义了 `InputEventReceiver` 子类,并试图通过反射实例化该类。若该类未定义与参数匹配的构造方法,则会抛出 `NoSuchMethodException`。此外,如果模块启用了代码混淆(ProGuard),而未在 `proguard.flags` 中保留相关类或构造方法,则可能导致类结构被重命名或优化,从而无法通过反射正确访问构造方法 [^1]。 解决此类问题的方法包括: - 确保自定义类包含所需的构造方法,例如: ```java public class MyInputEventReceiver extends InputEventReceiver { public MyInputEventReceiver(InputChannel inputChannel, Looper looper) { super(inputChannel, looper); } @Override public void onInputEvent(InputEvent event) { // 处理输入事件 } } ``` - 如果启用了 ProGuard 混淆编译,应在 `proguard.flags` 文件中添加如下规则以保留构造方法信息: ``` -keep class com.example.MyInputEventReceiver { public <init>(android.view.InputChannel, android.os.Looper); } ``` - 或者,在模块的 `.mk` 文件中禁用 ProGuard 混淆功能: ``` LOCAL_PROGUARD_ENABLED := disabled ``` 通过上述方式可以避免因类名、方法名被混淆而导致的反射失败问题,确保运行时能够正确查找并调用目标构造方法 [^1]。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值