java.lang.IllegalArgumentException: Can not set xxxx field XXXX

本文探讨了在Java与MySQL交互过程中,因数据类型不匹配导致的IllegalArgumentException异常。以Book类与book表的Year类型字段为例,详细解析了异常产生的原因,并提供了将Year类型改为Date类型的解决方案。

IllegalArgumentException: 非法参数异常

产生异常的原因:

在Java与mysql交互数据时,由于定义数据类型的不一致,我们在从mysql中读取数据到Java中进行类型转换时,时常会因为数据类型的不一致而导致该异常。

解决方法:

  • 以我目前的案例为例:
    Book类对应mysql中的book表,类中定义了一个Year类型的publishYear变量
    在这里插入图片描述
    mysql表中定义了一个year类型变量
    在这里插入图片描述
    由于java数据类型与mysql类型的数据对应不是这两个类型,因此发生以下异常:

java.lang.IllegalArgumentException: Can not set java.time.Year field com.aluem.bean.Book.publishYear to java.sql.Date

大意为:不能将java.time.Year类型属性设置成java.sql.Date类型。

  • 解决方案
    • 通过查询java数据类型与mysql类型的数据对应类型表,得知此处应该将Book类中的publishYear属性改为Date类型。如下图:在这里插入图片描述
      再次测试,成功得到数据。
      在这里插入图片描述

Java数据类型和MySql数据类型对应表

类型名称显示长度数据库类型JAVA类型JDBC类型索引(int)描述
VARCHARL+NVARCHARjava.lang.String12
CHARNCHARjava.lang.String1
BLOBL+NBLOBjava.lang.byte[]-4
TEXT65535VARCHARjava.lang.String-1
INTEGER4INTEGERUNSIGNEDjava.lang.Long4
TINYINT3TINYINT UNSIGNEDjava.lang.Integer-6
SMALLINT5SMALLINT UNSIGNEDjava.lang.Integer5
MEDIUMINT8MEDIUMINT UNSIGNEDjava.lang.Integer4
BIT1BITjava.lang.Boolean-7
BIGINT20BIGINT UNSIGNEDjava.math.BigInteger-5
FLOAT4+8FLOATjava.lang.Float7
DOUBLE22DOUBLEjava.lang.Double8
DECIMAL11DECIMALjava.math.BigDecimal3
BOOLEAN1同TINYINT
ID11PK (INTEGER UNSIGNED)java.lang.Long 4
DATE10DATEjava.sql.Date 91
TIME8TIMEjava.sql.Time92
DATETIME19DATETIMEjava.sql.Timestamp93
TIMESTAMP19TIMESTAMPjava.sql.Timestamp93
YEAR4YEARjava.sql.Date91
### 引发 `java.lang.IllegalArgumentException: Can not set int field entity.Project.viewTimes to null value` 的原因分析 此异常通常发生在 Java 应用程序尝试将 `null` 值赋给一个基本类型字段(如 `int`)时。在 Java 中,基本类型如 `int` 是不能为 `null` 的,它们有默认值(例如 `int` 的默认值是 `0`)。如果某个框架(如 Hibernate 或 Jackson)尝试将数据库中的 `NULL` 值直接映射到 `int` 类型字段,则会抛出此异常[^1]。 在实际开发中,尤其是在使用 JPA 或 MyBatis 等 ORM 框架时,如果数据库字段允许为 `NULL`,而对应的实体类字段被声明为 `int` 类型,则会触发此问题。例如: ```java public class Project { private int viewTimes; // 基本类型,不能接受 null } ``` 当数据库中 `viewTimes` 字段为 `NULL` 时,框架尝试将 `NULL` 赋值给 `int` 类型字段,就会抛出 `IllegalArgumentException`。 ### 解决方案 #### 使用包装类型替代基本类型 将实体类中的字段类型从基本类型(如 `int`)改为对应的包装类型(如 `Integer`),因为包装类型可以接受 `null` 值: ```java public class Project { private Integer viewTimes; // 改为包装类型 } ``` 这样,即使数据库字段为 `NULL`,也可以正确映射到 `null` 值,而不会抛出异常[^1]。 #### 在数据库层面避免 `NULL` 值 如果业务逻辑中不希望字段为 `NULL`,可以在数据库设计时设置默认值,例如将 `viewTimes` 设置为 `0`,从而避免框架尝试赋值 `null` 的情况: ```sql ALTER TABLE Project MODIFY viewTimes INT DEFAULT 0; ``` #### 在 ORM 映射中处理 `NULL` 值 对于使用 XML 配置的 MyBatis 或自定义的映射逻辑,可以在映射文件中指定默认值或使用类型处理器(TypeHandler)来处理 `NULL` 值,确保其转换为 `0` 而非 `null`。 例如,在 MyBatis 中可以使用 `<if>` 标签进行判断: ```xml <resultMap id="projectResultMap" type="Project"> <result property="viewTimes" column="viewTimes" /> </resultMap> ``` 或者使用自定义的 `TypeHandler` 实现空值处理逻辑。 ### 示例:修改后的实体类 ```java public class Project { private Integer viewTimes; // 使用包装类型 public Integer getViewTimes() { return viewTimes; } public void setViewTimes(Integer viewTimes) { this.viewTimes = viewTimes; } } ``` 通过上述修改,可以有效避免 `IllegalArgumentException` 的发生,同时提高代码的健壮性。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值